11# syntax=docker/dockerfile:1
2+ # syntax directive is used to enable Docker BuildKit
23
34ARG PYTHON_VERSION=3.14
45
@@ -7,8 +8,8 @@ FROM python:${PYTHON_VERSION}-slim AS base
78ARG PROJECT_DIR="/src"
89ARG APP_USER="app"
910ARG APP_GROUP="app"
10- ARG NEW_UID=1000
11- ARG NEW_GID=1000
11+ ARG NEW_UID
12+ ARG NEW_GID
1213
1314ENV PYTHONDONTWRITEBYTECODE=1 \
1415 PYTHONUNBUFFERED=1 \
@@ -23,6 +24,17 @@ RUN groupadd --system ${APP_GROUP} --gid=${NEW_GID} && \
2324 --gid ${NEW_GID} \
2425 ${APP_USER}
2526
27+ # Runtime-only system dependencies
28+ RUN apt-get update && \
29+ apt-get install -y --no-install-recommends \
30+ openssl \
31+ libssl3 \
32+ libsodium23 \
33+ postgresql-client \
34+ && rm -rf /var/lib/apt/lists/*
35+
36+ WORKDIR ${PROJECT_DIR}
37+
2638# Builder stage for compilation and dependencies
2739FROM base AS builder
2840
@@ -31,7 +43,6 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
3143 apt-get update && \
3244 apt-get install -y --no-install-recommends \
3345 git \
34- curl \
3546 ca-certificates \
3647 pkg-config \
3748 libssl-dev \
@@ -51,48 +62,40 @@ RUN git clone --depth 1 --branch v0.9.3 https://github.com/stef/liboprf.git . &&
5162 cd src && \
5263 make
5364
54- # Install Python dependencies
65+ # Install Python dependencies into a virtualenv
5566WORKDIR ${PROJECT_DIR}
5667COPY ./pyproject.toml ./poetry.lock ./
5768
58- ENV POETRY_CACHE_DIR=/root/.cache/poetry \
59- POETRY_VIRTUALENVS_CREATE=false
69+ ENV POETRY_CACHE_DIR=/tmp/poetry-cache \
70+ POETRY_VIRTUALENVS_CREATE=true \
71+ POETRY_VIRTUALENVS_IN_PROJECT=true
6072
61- RUN --mount=type=cache,target=/root/.cache/poetry \
73+ RUN --mount=type=cache,target=${POETRY_CACHE_DIR} \
6274 poetry install --no-root --no-interaction --only main
6375
6476# Final stage
6577FROM base AS final
6678
67- ARG PYTHON_VERSION
68-
69- # Install only runtime dependencies
70- RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
71- --mount=type=cache,target=/var/lib/apt,sharing=locked \
72- apt-get update && \
73- apt-get install -y --no-install-recommends \
74- openssl \
75- curl \
76- libssl3 \
77- libsodium23 \
78- postgresql-client \
79- gettext-base \
80- && rm -rf /var/lib/apt/lists/*
81-
82- WORKDIR ${PROJECT_DIR}
83-
8479# Copy compiled libraries
85- COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /liboprf/src/noise_xk/lib*.so /usr/local/lib/
86- COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /liboprf/src/lib*.so /usr/local/lib/
80+ COPY --from=builder /liboprf/src/noise_xk/lib*.so /usr/local/lib/
81+ COPY --from=builder /liboprf/src/lib*.so /usr/local/lib/
8782RUN ldconfig
8883
89- # Copy Python packages
90- COPY --chown=${APP_USER}:${APP_GROUP} --from=builder /usr/local/lib/python${PYTHON_VERSION}/site-packages /usr/local/lib/python${PYTHON_VERSION}/site-packages
84+ # Copy only the virtualenv — no pip, no poetry, no build tools
85+ COPY --from=builder -- chown=${APP_USER}:${APP_GROUP} /src/.venv /src/.venv
9186
92- # Copy application
93- COPY --chown=${APP_USER}:${APP_GROUP} . ${PROJECT_DIR}
87+ # Copy only what the app needs at runtime (no tests, docs, CI artifacts, etc.)
88+ COPY --chown=${APP_USER}:${APP_GROUP} app/ /src/app/
89+ COPY --chown=${APP_USER}:${APP_GROUP} sql/ /src/sql/
90+ COPY --chown=${APP_USER}:${APP_GROUP} tools/ /src/tools/
91+ COPY --chown=${APP_USER}:${APP_GROUP} app.conf.example /src/
92+
93+ # version.json is generated from build args so CI workspace artifacts never leak in
94+ ARG RELEASE_VERSION=dev
95+ ARG GIT_SHA=unknown
96+ RUN echo "{\" version\" : \" ${RELEASE_VERSION}\" , \" git_ref\" : \" ${GIT_SHA}\" }" > /src/version.json \
97+ && chown ${APP_USER}:${APP_GROUP} /src/version.json
9498
95- # Copy and set permissions on entrypoint scripts
9699COPY --chmod=755 ./docker/init-standalone.sh /usr/local/bin/
97100COPY --chmod=755 ./docker/init.sh /usr/local/bin/
98101
@@ -106,6 +109,11 @@ RUN if [ "$standalone" = "true" ] ; then \
106109
107110USER ${APP_USER}
108111
109- ENV PYTHONPATH=${PROJECT_DIR}
112+ EXPOSE 6502
113+ WORKDIR ${PROJECT_DIR}
114+
115+ ENV PYTHONPATH=${PROJECT_DIR} \
116+ VIRTUAL_ENV=/src/.venv \
117+ PATH="/src/.venv/bin:$PATH"
110118
111119ENTRYPOINT ["/docker-entrypoint.sh" ]
0 commit comments