Ein drei Jahre altes Basis-Dockerfile, mit dem ich mit Multi-Stage-Builds rumgeeimert habe.
Das Build-Image baut eine Compile-Umgebung auf, und baut dann aus der requirements-frozen.txt
die notwendigen Wheels.
Die werden dann ins Deploy-Image rüber getragen. Dort wird dann auch der Code importiert (der hier nicht groß ist – es ist kaum mehr als ein hello_world.py).
Ich habe eine requirements.txt
, die die Dependencies importiert und die so das Venv baut.
Dann mache ich ein
(venv) $ pip freeze -r requirements.txt > requirements-frozen.txt
(venv) $
Dies zeichnet nicht nur die bewußt importierten Dependencies auf, sondern auch deren Dependencies, mit fixierten Versionen.
Indem ich das Image mit der requirements-frozen.txt
bauen (die mit eingecheckt wird), habe ich im Image dieselben Versionen wie beim Testen.
(base) kk:~ kris$ cd PycharmProjects/dockertest/
(base) kk:dockertest kris$ cat Dockerfile
FROM python:3.10-slim as builder
LABEL maintainer="isotopp" \
description="A test image"
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update && \
apt-get install -y --no-install-recommends gcc git build-essential
COPY requirements-frozen.txt /tmp/requirements.txt
RUN cd /tmp && pip wheel --no-cache-dir --no-deps --wheel-dir=/tmp/wheels -r requirements.txt
# -----
FROM python:3.10-slim
WORKDIR /app
#COPY --from=builder /tmp/wheels /wheels
#RUN pip install --no-cache /wheels/*
COPY . /app
CMD [ "python3", "-u", "main.py" ]