79 lines
3.4 KiB
Text
79 lines
3.4 KiB
Text
|
|
# Kurs-Image zu "Optimierte Entscheidungsfindung mit Python".
|
||
|
|
#
|
||
|
|
# Was es ist: eine reproduzierbare Umgebung, in der alle Beispielprogramme
|
||
|
|
# laufen - ohne dass jemand Solver, BLAS-Bibliotheken und Python-Versionen von
|
||
|
|
# Hand zusammensuchen muss.
|
||
|
|
#
|
||
|
|
# Was es NICHT ist: eine Bauumgebung fuer das Buch. Das PDF braucht pandoc,
|
||
|
|
# xelatex und inkscape, zusammen ueber ein Gigabyte. Wer das Buch selbst baut,
|
||
|
|
# ist mit einer lokalen Installation besser bedient (siehe README.md).
|
||
|
|
#
|
||
|
|
# docker build -t or-mit-python .
|
||
|
|
# docker run --rm or-mit-python Installationstest.py
|
||
|
|
# docker run --rm -it or-mit-python # Python-Eingabe
|
||
|
|
# docker run --rm -v "$PWD/ausgabe:/buch/output" or-mit-python Excel_Bruecke.py
|
||
|
|
#
|
||
|
|
# Zwei Stufen: Die erste baut die Abhaengigkeiten in eine virtuelle Umgebung
|
||
|
|
# (und braucht dafuer Compiler), die zweite kopiert nur das Ergebnis. Das
|
||
|
|
# spart im fertigen Image die gesamte Bauumgebung.
|
||
|
|
|
||
|
|
# --- Stufe 1: Abhaengigkeiten uebersetzen und einsammeln ---------------------
|
||
|
|
FROM python:3.12-slim AS bau
|
||
|
|
|
||
|
|
# build-essential wird von Paketen gebraucht, die kein passendes Wheel
|
||
|
|
# mitbringen. Bleibt in dieser Stufe und landet nie im fertigen Image.
|
||
|
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||
|
|
build-essential \
|
||
|
|
&& rm -rf /var/lib/apt/lists/*
|
||
|
|
|
||
|
|
ENV PIP_NO_CACHE_DIR=1 \
|
||
|
|
PIP_DISABLE_PIP_VERSION_CHECK=1
|
||
|
|
RUN python -m venv /opt/venv
|
||
|
|
ENV PATH="/opt/venv/bin:$PATH"
|
||
|
|
|
||
|
|
# Nur die Abhaengigkeitsbeschreibung kopieren, nicht den Quelltext: So bleibt
|
||
|
|
# diese Schicht im Cache, solange sich die Abhaengigkeiten nicht aendern.
|
||
|
|
WORKDIR /buch
|
||
|
|
COPY pyproject.toml README.md ./
|
||
|
|
|
||
|
|
# Die Gruppen aus pyproject.toml. 'figures' fehlt bewusst - es dient dem
|
||
|
|
# Neuerzeugen der Diagramme, wofuer zusaetzlich Graphviz noetig waere.
|
||
|
|
#
|
||
|
|
# ACHTUNG, gewollt: Das Image enthaelt ortools UND highspy, obwohl beide eine
|
||
|
|
# eigene HiGHS-Kopie mitbringen und sich nicht gemeinsam importieren lassen.
|
||
|
|
# Der Konflikt wird nicht durch Weglassen geloest, sondern zur Laufzeit durch
|
||
|
|
# getrennte Prozesse (Kapitel Oekosystem). Ein Image, das nur eines von beiden
|
||
|
|
# enthaelt, koennte die Haelfte der Beispiele nicht ausfuehren.
|
||
|
|
RUN pip install ".[finance,large-scale,api,dev]"
|
||
|
|
|
||
|
|
# --- Stufe 2: das eigentliche Image -----------------------------------------
|
||
|
|
FROM python:3.12-slim AS laufzeit
|
||
|
|
|
||
|
|
# libgomp1 wird von OR-Tools und HiGHS zur Laufzeit gebraucht (OpenMP) und ist
|
||
|
|
# im slim-Image nicht enthalten. Ohne es scheitert der erste Solveraufruf mit
|
||
|
|
# einem 'libgomp.so.1: cannot open shared object file'.
|
||
|
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||
|
|
libgomp1 \
|
||
|
|
&& rm -rf /var/lib/apt/lists/*
|
||
|
|
|
||
|
|
COPY --from=bau /opt/venv /opt/venv
|
||
|
|
ENV PATH="/opt/venv/bin:$PATH" \
|
||
|
|
PYTHONUNBUFFERED=1 \
|
||
|
|
MPLBACKEND=Agg
|
||
|
|
|
||
|
|
# Kein root. Die Programme brauchen keine Rechte, und ein Kurs-Image, das als
|
||
|
|
# root laeuft, ist eine schlechte Angewohnheit, die man weitergibt.
|
||
|
|
RUN useradd --create-home --uid 1000 kurs
|
||
|
|
WORKDIR /buch
|
||
|
|
COPY --chown=kurs:kurs Operations_Research_mit_Python_Version_04_Programme/ ./
|
||
|
|
|
||
|
|
# Verzeichnis fuer erzeugte Dateien - als Volume einhaengbar, damit
|
||
|
|
# Excel-Ausgaben und Diagramme den Container ueberleben. Angelegt wird es
|
||
|
|
# VOR dem Benutzerwechsel, denn /buch gehoert root.
|
||
|
|
RUN mkdir -p /buch/output && chown kurs:kurs /buch/output
|
||
|
|
USER kurs
|
||
|
|
|
||
|
|
# Ohne Argument eine Python-Eingabeaufforderung, mit Argument das genannte
|
||
|
|
# Programm: 'docker run --rm or-mit-python Rucksack.py'
|
||
|
|
ENTRYPOINT ["python"]
|
||
|
|
CMD []
|