# ============================================================================= # Formeleon - Multi-tenant Form Generator # Author: Björn Runden # File: Dockerfile # Description: Multi-stage Docker build for development and production. # ============================================================================= # ============================================================================= # Builder Stage: Install dependencies in a virtual environment # ============================================================================= FROM python:3.13-slim as builder # Set environment variables for builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # Install build dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libpq-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Create and activate virtual environment RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Install python dependencies COPY requirements.txt . RUN pip install --upgrade pip && \ pip install -r requirements.txt # ============================================================================= # Final Stage: Lean runtime image # ============================================================================= FROM python:3.13-slim # Set environment variables for runtime ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ FLASK_APP=app.py \ PATH="/opt/venv/bin:$PATH" # Install required runtime system dependencies (curl for healthcheck) RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ libpq5 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Copy the virtual environment from builder stage COPY --from=builder /opt/venv /opt/venv # Copy entrypoint script and ensure it's executable COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # Copy application code COPY . . # Create necessary runtime directories RUN mkdir -p /tmp/formeleon_uploads && \ mkdir -p /app/data && \ mkdir -p /app/logs && \ touch /tmp/formeleon_uploads/.gitkeep EXPOSE 5000 # Health check HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://127.0.0.1:5000/ || exit 1 ENTRYPOINT ["/entrypoint.sh"] CMD ["server"]