# shopdb-flask single-site container. # # One image, one site. Per ADR-004, each adopting facility runs its own # stack with its own DB, secrets, and enabled-plugin list. This image # bundles all six core plugins; install them at runtime with # `flask plugin install `. # # Build: # docker build -t shopdb-flask . # Run (with .env): # docker run --env-file .env -p 5001:5001 shopdb-flask FROM python:3.12-slim AS base ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ default-libmysqlclient-dev \ pkg-config \ curl \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt \ && pip install --no-cache-dir gunicorn COPY shopdb/ ./shopdb/ COPY plugins/ ./plugins/ COPY migrations/ ./migrations/ COPY scripts/ ./scripts/ COPY wsgi.py ./ RUN useradd --create-home --shell /bin/bash shopdb \ && chown -R shopdb:shopdb /app USER shopdb EXPOSE 5001 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl --fail --silent http://localhost:5001/api/auth/login -X POST \ -H "Content-Type: application/json" -d '{}' \ | grep -q "VALIDATION_ERROR" || exit 1 CMD ["gunicorn", \ "--bind", "0.0.0.0:5001", \ "--workers", "4", \ "--timeout", "60", \ "--access-logfile", "-", \ "--error-logfile", "-", \ "wsgi:app"]