Skip to content

Instantly share code, notes, and snippets.

@Anexen
Last active August 29, 2023 07:45
Show Gist options
  • Save Anexen/f1f2b815734a6877e426defdfa1b2fb4 to your computer and use it in GitHub Desktop.
Save Anexen/f1f2b815734a6877e426defdfa1b2fb4 to your computer and use it in GitHub Desktop.
production-ready dockerfile for python projects
# syntax = docker/dockerfile:experimental
ARG PYTHON_VERSION=3.7.6
ARG APP_ENV=prod
# ---------------------------------------------------------------
FROM python:${PYTHON_VERSION}-stretch AS base-builder
ENV VIRTUAL_ENV=/opt/venv
RUN python -m venv ${VIRTUAL_ENV}
# ---------------------------------------------------------------
FROM base-builder AS prod-builder
COPY requirements.txt .
RUN --mount=type=cache,target=/root/.cache/pip \
${VIRTUAL_ENV}/bin/pip install -r requirements.txt
# ---------------------------------------------------------------
FROM prod-builder AS dev-builder
COPY requirements-dev.txt .
RUN --mount=type=cache,target=/root/.cache/pip \
${VIRTUAL_ENV}/bin/pip install -r requirements-dev.txt
# ---------------------------------------------------------------
FROM ${APP_ENV}-builder AS builder
# ---------------------------------------------------------------
FROM python:${PYTHON_VERSION}-slim-stretch AS base
ARG APP_USER=appuser
ARG APP_USER_UID=1000
ARG APP_ROOT=/app
ENV VIRTUAL_ENV=/opt/venv
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
RUN useradd --create-home --uid=${APP_USER_UID} ${APP_USER} \
&& mkdir -p ${VIRTUAL_ENV} \
&& chown ${APP_USER}:${APP_USER} ${VIRTUAL_ENV}
WORKDIR ${APP_ROOT}
# ---------------------------------------------------------------
FROM base AS test
COPY --from=dev-builder --chown=${APP_USER}:${APP_USER} ${VIRTUAL_ENV} ${VIRTUAL_ENV}
COPY --chown=${APP_USER}:${APP_USER} . ${APP_ROOT}
CMD ["pytest"]
# ---------------------------------------------------------------
FROM base AS release
COPY --from=builder --chown=${APP_USER}:${APP_USER} ${VIRTUAL_ENV} ${VIRTUAL_ENV}
COPY --chown=${APP_USER}:${APP_USER} . ${APP_ROOT}
USER ${APP_USER}
EXPOSE 8000
RUN ["python"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment