#!/bin/bash BASE_DIR="/mnt/data" CONTAINERS_DIR="$BASE_DIR/containers" VOLUMES_DIR="$BASE_DIR/volumes" # Ensure base dirs exist mkdir -p "$CONTAINERS_DIR" mkdir -p "$VOLUMES_DIR" function create_container() { echo "Enter container name (e.g. dockhand, grafana):" read NAME if [ -z "$NAME" ]; then echo "❌ Name cannot be empty" return fi CONTAINER_PATH="$CONTAINERS_DIR/$NAME" VOLUME_PATH="$VOLUMES_DIR/$NAME/data" if [ -d "$CONTAINER_PATH" ]; then echo "⚠️ Container already exists!" return fi echo "🚀 Creating structure..." mkdir -p "$CONTAINER_PATH" mkdir -p "$VOLUME_PATH" COMPOSE_FILE="$CONTAINER_PATH/docker-compose.yml" cat < "$COMPOSE_FILE" version: "3.9" services: $NAME: image: your-image-here container_name: $NAME restart: unless-stopped ports: - "PORT:PORT" volumes: - /var/run/docker.sock:/var/run/docker.sock - $VOLUME_PATH:/app/data environment: - TZ=Australia/Melbourne logging: driver: "json-file" options: max-size: "10m" max-file: "3" # networks: # ${NAME}_net: # driver: bridge EOF echo "✅ Created:" echo "📁 $CONTAINER_PATH" echo "📁 $VOLUME_PATH" echo "📄 docker-compose.yml" echo "" echo "👉 Opening docker-compose.yml for editing..." sleep 1 nano "$COMPOSE_FILE" } function start_container() { echo "Enter container name to start:" read NAME CONTAINER_PATH="$CONTAINERS_DIR/$NAME" if [ ! -d "$CONTAINER_PATH" ]; then echo "❌ Container not found!" return fi cd "$CONTAINER_PATH" || return docker compose up -d echo "✅ Container started" } function list_containers() { echo "📦 Available containers:" ls "$CONTAINERS_DIR" } function main_menu() { while true; do clear echo "======================================" echo " 🚀 Container Management Menu" echo "======================================" echo "1. Create New Container" echo "2. Start Container" echo "3. List Containers" echo "4. Exit" echo "======================================" echo "Choose an option:" read OPTION case $OPTION in 1) create_container ;; 2) start_container ;; 3) list_containers; read -p "Press enter to continue..." ;; 4) exit 0 ;; *) echo "❌ Invalid option"; sleep 1 ;; esac done } main_menu