88 lines
1.8 KiB
Docker
88 lines
1.8 KiB
Docker
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 pipenv
|
|
|
|
# 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 Pipfile .
|
|
COPY Pipfile.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 pipenv install --dev
|
|
|
|
# Run tests
|
|
RUN make test
|
|
|
|
# Clean up test environment
|
|
RUN rm -rf .venv
|
|
RUN rm -rf ./tests ./Makefile
|
|
|
|
# Install production environment
|
|
RUN pipenv install --deploy
|
|
|
|
|
|
### 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 ["pipenv", "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
|