11FROM --platform=linux/amd64 python:3.13.7-bookworm AS build
22
33ARG dev=0
4- ENV POETRY_VIRTUALENVS_PATH=/app/services/mcp-server/.venv
5- ENV POETRY_VERSION=2.1.3
4+ ENV POETRY_VIRTUALENVS_PATH=/opt/.venv \
5+ POETRY_VIRTUALENVS_CREATE=false \
6+ POETRY_VIRTUALENVS_IN_PROJECT=false \
7+ VIRTUAL_ENV=/opt/.venv \
8+ PATH=/opt/.venv/bin:$PATH \
9+ POETRY_VERSION=2.1.3
610
711WORKDIR /app
812
@@ -19,7 +23,8 @@ COPY services/mcp-server/pyproject.toml services/mcp-server/poetry.lock ./
1923RUN mkdir log && chmod 700 log
2024RUN touch /app/services/mcp-server/log/logfile.log && chmod 600 /app/services/mcp-server/log/logfile.log
2125
22- RUN poetry config virtualenvs.create false &&\
26+ # Cache bust with dev arg so dev dependencies install when dev=1
27+ RUN echo "CACHE_BUST_DEV=$dev" && poetry config virtualenvs.create false &&\
2328 if [ "$dev" = "1" ]; then \
2429 poetry install --no-interaction --no-ansi --no-root --with dev; \
2530 else \
@@ -31,7 +36,8 @@ ARG dev=0
3136
3237RUN adduser --disabled-password --gecos "" --uid 10001 nonroot
3338
34- ENV POETRY_VIRTUALENVS_PATH=/app/services/mcp-server/.venv
39+ ENV POETRY_VIRTUALENVS_PATH=/opt/.venv
40+
3541COPY --from=build --chown=nonroot:nonroot ${POETRY_VIRTUALENVS_PATH} ${POETRY_VIRTUALENVS_PATH}
3642COPY --from=build /usr/local/bin/ /usr/local/bin/
3743COPY --from=build /usr/bin/make /usr/bin/make
@@ -42,6 +48,13 @@ COPY --chown=nonroot:nonroot services/mcp-server/src ./src
4248COPY --chown=nonroot:nonroot services/mcp-server/tests ./tests
4349COPY --chown=nonroot:nonroot services/mcp-server/pyproject.toml services/mcp-server/poetry.lock ./
4450COPY --chown=nonroot:nonroot services/mcp-server/Makefile ./
51+
52+ # Ensure poetry reuses existing virtualenv when running as nonroot
53+ ENV POETRY_VIRTUALENVS_CREATE=false \
54+ POETRY_VIRTUALENVS_IN_PROJECT=false \
55+ VIRTUAL_ENV=/opt/.venv \
56+ PATH=/opt/.venv/bin:$PATH
57+
4558# cleanup
4659RUN apt-get clean autoclean
4760RUN apt-get autoremove --yes
@@ -50,15 +63,13 @@ RUN if [ "$dev" = "0" ]; then \
5063 while read -r shell; do rm -f "$shell" ; done < /etc/shells; \
5164 rm -rf /var/lib/{apt,dpkg,cache,log}/ \
5265 else \
53- echo "POETRY_VIRTUALENVS_PATH=/app/services/mcp-server /.venv" >> /etc/environment;\
54- export POETRY_VIRTUALENVS_PATH=/app/services/mcp-server /.venv;\
66+ echo "POETRY_VIRTUALENVS_PATH=/opt /.venv" >> /etc/environment;\
67+ export POETRY_VIRTUALENVS_PATH=/opt /.venv;\
5568 export PATH="${POETRY_VIRTUALENVS_PATH}/bin:$PATH" ;\
5669 fi
5770
5871
5972USER nonroot
6073COPY --from=build --chown=nonroot:nonroot /app/services/mcp-server/log /app/services/mcp-server/log
6174
62- ENV PATH="${POETRY_VIRTUALENVS_PATH}/bin:${PATH}"
63-
6475CMD [ "poetry" , "run" , "python" , "src/main.py" ]
0 commit comments