FROM ghcr.io/astral-sh/uv:0.11.30@sha256:93b61e21202b1dab861092748e46bbd6e0e41dd84f59b9174efd2353186e1b47 AS uv FROM python:3.12-slim-bookworm@sha256:392307d22300de8b5986851a12d9176dfc0fc073e65bf6523ebd7dcbeb23564e AS builder COPY --from=uv /uv /usr/local/bin/uv WORKDIR /app ENV UV_PYTHON_DOWNLOADS=never UV_LINK_MODE=copy TMPDIR=/app/.work RUN mkdir /app/.work COPY pyproject.toml uv.lock ./ ARG DEPENDENCY_GROUP=runtime RUN --mount=type=cache,target=/root/.cache/uv \ if [ "$DEPENDENCY_GROUP" = inference ]; then \ uv sync --locked --no-default-groups --group inference --no-install-project; \ elif [ "$DEPENDENCY_GROUP" = runtime ]; then \ uv sync --locked --no-default-groups --no-install-project; \ else exit 1; fi COPY src/ src/ RUN --mount=type=cache,target=/root/.cache/uv \ if [ "$DEPENDENCY_GROUP" = inference ]; then \ uv sync --locked --no-default-groups --group inference --no-editable; \ else uv sync --locked --no-default-groups --no-editable; fi FROM python:3.12-slim-bookworm@sha256:392307d22300de8b5986851a12d9176dfc0fc073e65bf6523ebd7dcbeb23564e AS runtime RUN useradd --uid 10001 --create-home app WORKDIR /app ENV PATH=/app/.venv/bin:$PATH PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1 TMPDIR=/app/.work COPY --from=builder /app/.venv /app/.venv COPY alembic.ini oms-alembic.ini ./ COPY migrations/ migrations/ COPY oms_migrations/ oms_migrations/ RUN mkdir /app/.work && chown app:app /app/.work USER 10001:10001 EXPOSE 8000 CMD ["uvicorn", "zhifu.app:create_app", "--factory", "--host", "0.0.0.0", "--port", "8000", "--timeout-graceful-shutdown", "60"]