gcp-hockey-results/docker/run.sh
2025-09-29 20:06:07 +08:00

193 lines
6.2 KiB
Bash

#!/bin/bash
# Docker run script for Hockey Results Application
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default configuration
IMAGE_NAME="hockey-results:latest"
CONTAINER_NAME="hockey-results-app"
PORT="5000:5000"
DATABASE_TYPE="sqlite"
VOLUME_MOUNT=""
# Function to display usage
usage() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -i, --image IMAGE Docker image name (default: hockey-results:latest)"
echo " -c, --container NAME Container name (default: hockey-results-app)"
echo " -p, --port PORT Port mapping (default: 5000:5000)"
echo " -d, --database TYPE Database type: sqlite, postgresql, mysql (default: sqlite)"
echo " -v, --volume PATH Mount volume for data persistence"
echo " --detach Run container in background"
echo " --rm Remove container when it exits"
echo " --env KEY=VALUE Set environment variable"
echo " -h, --help Show this help message"
echo ""
echo "Database Types:"
echo " sqlite Use SQLite database (default, no external dependencies)"
echo " postgresql Use PostgreSQL database"
echo " mysql Use MySQL/MariaDB database"
echo ""
echo "Examples:"
echo " $0 # Run with SQLite"
echo " $0 -d postgresql # Run with PostgreSQL"
echo " $0 -v ./data:/app/data # Run with data persistence"
echo " $0 -p 8080:5000 # Run on different port"
echo " $0 --detach # Run in background"
}
# Parse command line arguments
DETACH=""
REMOVE=""
ENV_VARS=""
while [[ $# -gt 0 ]]; do
case $1 in
-i|--image)
IMAGE_NAME="$2"
shift 2
;;
-c|--container)
CONTAINER_NAME="$2"
shift 2
;;
-p|--port)
PORT="$2"
shift 2
;;
-d|--database)
DATABASE_TYPE="$2"
shift 2
;;
-v|--volume)
VOLUME_MOUNT="-v $2"
shift 2
;;
--detach)
DETACH="-d"
shift
;;
--rm)
REMOVE="--rm"
shift
;;
--env)
ENV_VARS="$ENV_VARS -e $2"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo -e "${RED}Unknown option: $1${NC}"
usage
exit 1
;;
esac
done
echo -e "${BLUE}🏒 Running Hockey Results Application${NC}"
echo -e "${BLUE}====================================${NC}"
# Check if Docker is running
if ! docker info > /dev/null 2>&1; then
echo -e "${RED}❌ Docker is not running. Please start Docker and try again.${NC}"
exit 1
fi
# Check if image exists
if ! docker images -q "$IMAGE_NAME" | grep -q .; then
echo -e "${YELLOW}⚠️ Image $IMAGE_NAME not found. Building it first...${NC}"
./docker/build.sh -n "$(echo $IMAGE_NAME | cut -d':' -f1)" -t "$(echo $IMAGE_NAME | cut -d':' -f2)"
fi
# Stop existing container if running
if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then
echo -e "${YELLOW}🛑 Stopping existing container...${NC}"
docker stop "$CONTAINER_NAME"
fi
# Remove existing container if it exists
if docker ps -aq -f name="$CONTAINER_NAME" | grep -q .; then
echo -e "${YELLOW}🗑️ Removing existing container...${NC}"
docker rm "$CONTAINER_NAME"
fi
# Set environment variables based on database type
case $DATABASE_TYPE in
"postgresql")
ENV_VARS="$ENV_VARS -e DATABASE_TYPE=postgresql"
ENV_VARS="$ENV_VARS -e POSTGRES_HOST=host.docker.internal"
ENV_VARS="$ENV_VARS -e POSTGRES_PORT=5432"
ENV_VARS="$ENV_VARS -e POSTGRES_DATABASE=hockey_results"
ENV_VARS="$ENV_VARS -e POSTGRES_USER=hockey_user"
ENV_VARS="$ENV_VARS -e POSTGRES_PASSWORD=hockey_password"
echo -e "${YELLOW}📊 Using PostgreSQL database${NC}"
;;
"mysql")
ENV_VARS="$ENV_VARS -e DATABASE_TYPE=mysql"
ENV_VARS="$ENV_VARS -e MYSQL_HOST=host.docker.internal"
ENV_VARS="$ENV_VARS -e MYSQL_PORT=3306"
ENV_VARS="$ENV_VARS -e MYSQL_DATABASE=hockey_results"
ENV_VARS="$ENV_VARS -e MYSQL_USER=hockey_user"
ENV_VARS="$ENV_VARS -e MYSQL_PASSWORD=hockey_password"
echo -e "${YELLOW}📊 Using MySQL/MariaDB database${NC}"
;;
"sqlite")
ENV_VARS="$ENV_VARS -e DATABASE_TYPE=sqlite"
ENV_VARS="$ENV_VARS -e SQLITE_DATABASE_PATH=/app/data/hockey_results.db"
VOLUME_MOUNT="$VOLUME_MOUNT -v $(pwd)/data:/app/data"
echo -e "${YELLOW}📊 Using SQLite database${NC}"
;;
*)
echo -e "${RED}❌ Unsupported database type: $DATABASE_TYPE${NC}"
echo -e "Supported types: sqlite, postgresql, mysql"
exit 1
;;
esac
echo -e "${BLUE}🚀 Starting container...${NC}"
echo -e " Image: ${GREEN}$IMAGE_NAME${NC}"
echo -e " Container: ${GREEN}$CONTAINER_NAME${NC}"
echo -e " Port: ${GREEN}$PORT${NC}"
echo -e " Database: ${GREEN}$DATABASE_TYPE${NC}"
# Run the container
docker run \
$DETACH \
$REMOVE \
--name "$CONTAINER_NAME" \
-p "$PORT" \
$VOLUME_MOUNT \
$ENV_VARS \
"$IMAGE_NAME"
if [ $? -eq 0 ]; then
if [ -n "$DETACH" ]; then
echo -e "${GREEN}✅ Container started successfully in background${NC}"
echo -e "${BLUE}📝 Container Information:${NC}"
docker ps -f name="$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo -e "${YELLOW}📋 Useful Commands:${NC}"
echo -e " View logs: ${BLUE}docker logs $CONTAINER_NAME${NC}"
echo -e " Stop container: ${BLUE}docker stop $CONTAINER_NAME${NC}"
echo -e " Remove container: ${BLUE}docker rm $CONTAINER_NAME${NC}"
echo -e " Access shell: ${BLUE}docker exec -it $CONTAINER_NAME /bin/bash${NC}"
else
echo -e "${GREEN}✅ Container finished${NC}"
fi
else
echo -e "${RED}❌ Failed to start container${NC}"
exit 1
fi