# syntax=docker/dockerfile:1.7 # # Backend-Image für moneyfy. Mehrstufig, damit im Endbild weder Build-Werkzeuge # noch Entwicklungsabhängigkeiten landen. # --- Abhängigkeiten ----------------------------------------------------------- FROM python:3.12-slim-bookworm AS deps # uv installiert die Abhängigkeiten deutlich schneller als pip. COPY --from=ghcr.io/astral-sh/uv:0.5.11 /uv /bin/uv ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \ PYTHONDONTWRITEBYTECODE=1 \ UV_LINK_MODE=copy WORKDIR /app # Nur die Abhängigkeitsdeklaration kopieren – die Schicht bleibt gültig, # solange sich pyproject.toml nicht ändert. COPY pyproject.toml ./ RUN /bin/uv pip install --system --no-cache -r pyproject.toml # --- Laufzeitbasis ------------------------------------------------------------ FROM python:3.12-slim-bookworm AS runtime ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PYTHONPATH=/app \ TZ=Europe/Berlin \ LOGO_STORAGE_DIR=/data/logos # tzdata wird für Europe/Berlin gebraucht, curl für den Healthcheck. RUN apt-get update \ && apt-get install -y --no-install-recommends tzdata curl \ && rm -rf /var/lib/apt/lists/* \ && groupadd --system --gid 10001 moneyfy \ && useradd --system --uid 10001 --gid moneyfy --create-home --home-dir /home/moneyfy moneyfy COPY --from=deps /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages COPY --from=deps /usr/local/bin /usr/local/bin WORKDIR /app # --- Entwicklung -------------------------------------------------------------- # Wird von docker-compose.override.yml genutzt; der Quellcode kommt per Volume. FROM runtime AS development COPY --from=ghcr.io/astral-sh/uv:0.5.11 /uv /usr/local/bin/uv COPY pyproject.toml ./ RUN uv pip install --system --no-cache -r pyproject.toml --extra dev COPY --chown=moneyfy:moneyfy . . RUN mkdir -p /data/logos && chown -R moneyfy:moneyfy /data USER moneyfy EXPOSE 8000 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] # --- Produktion --------------------------------------------------------------- FROM runtime AS production COPY --chown=moneyfy:moneyfy alembic.ini pyproject.toml ./ COPY --chown=moneyfy:moneyfy alembic ./alembic COPY --chown=moneyfy:moneyfy app ./app COPY --chown=moneyfy:moneyfy docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh \ && mkdir -p /data/logos \ && chown -R moneyfy:moneyfy /data USER moneyfy EXPOSE 8000 VOLUME ["/data"] HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \ CMD curl -fsS http://127.0.0.1:8000/api/health || exit 1 ENTRYPOINT ["entrypoint.sh"] CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--proxy-headers", "--forwarded-allow-ips", "*"]