# syntax=docker/dockerfile:1.10 # # svcforge reconciler. Build from the REPO ROOT: # docker buildx build -f services/reconciler/Dockerfile -t svcforge/reconciler:dev . # # Reads helm state to detect drift, so it carries helm — but never kubectl, and it never # writes: the four checks enqueue tasks, they do not provision. Orphans are logged, never # deleted. FROM python:3.12-slim@sha256:57cd7c3a7a273101a6485ba99423ee568157882804b1124b4dd04266317710de AS builder COPY --from=ghcr.io/astral-sh/uv:0.5.11@sha256:0ac957607303916420297a4c9c213bb33fbd3c888f9cd7f4f7273596ebf42b85 /uv /usr/local/bin/uv ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never WORKDIR /app COPY pyproject.toml uv.lock ./ COPY libs/svcforge_core/pyproject.toml libs/svcforge_core/ RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --frozen --no-dev --no-editable \ --no-install-project --no-install-package svcforge-core COPY libs/ libs/ COPY services/reconciler/ services/reconciler/ COPY catalog.yaml ./ RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --frozen --no-dev --no-editable && \ /app/.venv/bin/python -c 'import svcforge_core, sys; \ p = svcforge_core.__file__; \ sys.exit(0) if "site-packages" in p else sys.exit("not a wheel install: " + p)' # --- runtime -------------------------------------------------------------------------- FROM python:3.12-slim@sha256:57cd7c3a7a273101a6485ba99423ee568157882804b1124b4dd04266317710de ARG BUILD_SHA=unknown LABEL org.opencontainers.image.title="svcforge-reconciler" \ org.opencontainers.image.source="https://gitea.oci-oci.duckdns.org/gitea_admin/svcforge" \ org.opencontainers.image.revision="${BUILD_SHA}" RUN useradd -u 10001 -m -s /usr/sbin/nologin svcforge WORKDIR /app COPY --from=builder --chown=10001:10001 /app /app COPY --from=alpine/helm:3.16.2@sha256:a19a2968fd672336d39771f6c899781424d725229148656dbc2a1e305003cdec /usr/bin/helm /usr/local/bin/helm ENV PATH="/app/.venv/bin:$PATH" \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ HELM_CACHE_HOME=/tmp/helm/cache \ HELM_CONFIG_HOME=/tmp/helm/config \ HELM_DATA_HOME=/tmp/helm/data USER 10001 ENTRYPOINT ["python", "-m", "services.reconciler.main"]