FROM python:3.11-slim # Set working directory for the app WORKDIR /opt/moto_site # Install system dependencies RUN apt-get update && apt-get install -y \ gcc \ postgresql-client \ && rm -rf /var/lib/apt/lists/* # Copy requirements and install Python dependencies COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Copy all application code to /opt/moto_site COPY . . # Create uploads directory RUN mkdir -p uploads/images uploads/gpx # Set FLASK_APP so Flask CLI commands are available ENV FLASK_APP=run.py # Create a script to conditionally initialize database RUN echo '#!/bin/sh\n\ if [ ! -f /data/moto_adventure.db ]; then\n\ echo "Database not found, initializing..."\n\ flask --app run.py init-db\n\ flask --app run.py create-admin\n\ echo "Database initialized successfully"\n\ else\n\ echo "Database already exists, skipping initialization"\n\ fi' > /opt/moto_site/init_db_if_needed.sh && chmod +x /opt/moto_site/init_db_if_needed.sh # Create non-root user and set permissions RUN adduser --disabled-password --gecos '' appuser && \ chown -R appuser:appuser /opt/moto_site && \ mkdir -p /data && \ chown -R appuser:appuser /data USER appuser # Expose port EXPOSE 5000 # Run the application with Gunicorn, looking for run:app in /opt/moto_site ENTRYPOINT ["/bin/sh", "-c", "/opt/moto_site/init_db_if_needed.sh && exec gunicorn --bind 0.0.0.0:5000 run:app"]