# Containerfile for MOTM (Man of the Match) Application # Flask-based voting system for hockey matches # Stage 1: Build stage FROM python:3.11-slim as builder # Set environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # Install system dependencies for building Python packages RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ default-libmysqlclient-dev \ pkg-config \ && rm -rf /var/lib/apt/lists/* # Create and activate virtual environment RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Copy requirements and install Python dependencies COPY requirements.txt ./ RUN pip install --upgrade pip && \ pip install -r requirements.txt # Stage 2: Runtime stage FROM python:3.11-slim # Set environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PATH="/opt/venv/bin:$PATH" \ DATABASE_TYPE=postgresql \ FLASK_ENV=production \ FLASK_APP=main.py \ FLASK_RUN_HOST=0.0.0.0 \ FLASK_RUN_PORT=5000 # Install runtime dependencies RUN apt-get update && apt-get install -y \ libpq5 \ default-mysql-client \ curl \ && rm -rf /var/lib/apt/lists/* # Copy virtual environment from builder stage COPY --from=builder /opt/venv /opt/venv # Create non-root user RUN groupadd -r appuser && useradd -r -g appuser appuser # Create application directory WORKDIR /app # Copy application code COPY --chown=appuser:appuser . . # Create directories for data and logs RUN mkdir -p /app/data /app/logs && \ chown -R appuser:appuser /app/data /app/logs # Create a startup script for better initialization RUN echo '#!/bin/bash\n\ # Wait for database to be ready\n\ echo "Waiting for database connection..."\n\ while ! python -c "import psycopg2; psycopg2.connect(host=\"$DB_HOST\", port=\"$DB_PORT\", user=\"$DB_USER\", password=\"$DB_PASSWORD\", dbname=\"$DB_NAME\")" 2>/dev/null; do\n\ echo "Database not ready, waiting..."\n\ sleep 2\n\ done\n\ echo "Database connection established!"\n\ \n\ # Initialize database if needed\n\ python -c "from db_setup import db_config_manager; db_config_manager.load_config(); db_config_manager._update_environment_variables()"\n\ \n\ # Start the application\n\ exec python main.py' > /app/start.sh && \ chmod +x /app/start.sh && \ chown appuser:appuser /app/start.sh # Switch to non-root user USER appuser # Expose port EXPOSE 5000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:5000/ || exit 1 # Default command CMD ["/app/start.sh"]