FROM python:3.12-slim-trixie@sha256:09f7da3bc104798d0afb40bc08d23ab2da20a76130cec1f2ef170848f5d85217 AS builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 WORKDIR /build COPY backend ./backend COPY node-agent ./node-agent RUN python -m venv /opt/venv \ && /opt/venv/bin/pip install --no-cache-dir --upgrade pip "setuptools>=78.1.1" "msgpack>=1.2.1" \ && /opt/venv/bin/pip install --no-cache-dir ./backend ./node-agent \ && /opt/venv/bin/pip check \ && /opt/venv/bin/python -m pip uninstall --yes pip setuptools FROM python:3.12-slim-trixie@sha256:09f7da3bc104798d0afb40bc08d23ab2da20a76130cec1f2ef170848f5d85217 ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PATH="/opt/venv/bin:${PATH}" RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes \ && rm -rf /var/lib/apt/lists/* \ && /usr/local/bin/python -m pip uninstall --yes pip setuptools # Build identity. These are stamped in at build time so a running container can say exactly # where it came from; an argument that is never passed stays empty and is reported as null # rather than becoming a claimed commit. ARG MODELFORGE_VERSION=0.0.0 ARG MODELFORGE_COMMIT="" ARG MODELFORGE_BUILT_AT="" ENV MODELFORGE_BUILD_COMMIT=${MODELFORGE_COMMIT} ENV MODELFORGE_BUILD_TIMESTAMP=${MODELFORGE_BUILT_AT} LABEL org.opencontainers.image.title="ITWorx ModelForge node agent" LABEL org.opencontainers.image.description="Outbound-only compute node agent for ITWorx ModelForge" LABEL org.opencontainers.image.version="${MODELFORGE_VERSION}" LABEL org.opencontainers.image.revision="${MODELFORGE_COMMIT}" LABEL org.opencontainers.image.created="${MODELFORGE_BUILT_AT}" LABEL org.opencontainers.image.source="https://git.example.com/example/modelforge.git" LABEL org.opencontainers.image.vendor="ITWorx" LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" COPY --from=builder /opt/venv /opt/venv RUN groupadd --system --gid 101 modelforge-agent \ && useradd --system --uid 100 --gid 101 --home-dir /app --create-home modelforge-agent \ && mkdir -p /data/state /data/hf-cache /data/artifacts /data/quarantine \ && chown -R modelforge-agent:modelforge-agent /data WORKDIR /app USER modelforge-agent CMD ["modelforge-node-agent"]