ARG DEPLOY_DIR=/opt/om-parser-stw-potsdam-v2 ARG USERNAME=flaskd ARG LISTEN_PORT=3080 ### Shared base container FROM python:3.13-slim AS basesys ARG DEPLOY_DIR ARG USERNAME # Install dependencies RUN pip install --no-cache-dir uv # Add app user RUN adduser --disabled-password ${USERNAME} # Create app folder RUN mkdir -p ${DEPLOY_DIR} # Enable local venv ENV PIPENV_VENV_IN_PROJECT=1 # Switch to app folder WORKDIR ${DEPLOY_DIR} # Copy app folder contents COPY stw_potsdam/ ./stw_potsdam COPY tests ./tests COPY Makefile . COPY README.md . COPY pyproject.toml . COPY uv.lock . # Apply app user to app folder RUN chown -R ${USERNAME} . # Prepare environment USER ${USERNAME} ### Build & test container FROM basesys AS buildsys ARG DEPLOY_DIR ARG USERNAME # Install required build dependencies USER root RUN apt-get update && apt-get install -y build-essential python3-dev # Install environment USER ${USERNAME} RUN uv sync --frozen --extra dev # Run tests RUN make test # Clean up test environment RUN rm -rf .venv RUN rm -rf ./tests ./Makefile # Install production environment RUN uv sync --frozen --no-dev ### Production container FROM basesys ARG DEPLOY_DIR ARG LISTEN_PORT ARG USERNAME # Install dependencies USER root RUN apt-get update && apt-get install -y curl libpython3.13 # Copy built app USER ${USERNAME} COPY --from=buildsys ${DEPLOY_DIR}/.venv ${DEPLOY_DIR}/.venv WORKDIR ${DEPLOY_DIR} # Prepare runtime environment variables ENV LISTEN_PORT=${LISTEN_PORT} ENV LISTEN=0.0.0.0:${LISTEN_PORT} EXPOSE ${LISTEN_PORT} CMD ["sh", "-c", "uv run uwsgi --master --http11-socket \"$LISTEN\" --plugins python --protocol uwsgi --wsgi stw_potsdam.views:app --virtualenv ./.venv"] HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://127.0.0.1:$LISTEN_PORT/health_check || exit 1