webentwicklung-frage-antwort-db.com.de

Docker, wie man pip requirements.txt nur ausführt, wenn es eine Änderung gab?

In einem Dockerfile habe ich eine Ebene, die requirements.txt Installiert:

FROM python:2.7
RUN pip install -r requirements.txt

Wenn ich das Docker-Image erstelle, wird der gesamte Prozess ausgeführt nabhängig davon von Änderungen, die an dieser Datei vorgenommen wurden.

Wie stelle ich sicher, dass Docker nur dann pip install -r requirements.txt Ausführt, wenn die Datei geändert wurde?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/Django-rest-framework/archive/master.Zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/Django-rest-framework/archive/master.Zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))
53
Prometheus

Ich gehe davon aus, dass Sie irgendwann in Ihrem Erstellungsprozess Ihre gesamte Anwendung mit COPY oder ADD in das Docker-Image kopieren:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

Das Problem ist, dass Sie den Docker-Erstellungscache jedes Mal ungültig machen, wenn Sie die gesamte Anwendung in das Image kopieren. Dadurch wird auch der Cache für alle nachfolgenden Erstellungsschritte ungültig.

Um dies zu verhindern, würde ich vorschlagen, zu kopieren nur das requirements.txt Datei in einem separaten Erstellungsschritt, bevor die gesamte Anwendung zum Image hinzugefügt wird:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

Da sich die Anforderungsdatei selbst wahrscheinlich nur selten ändert, können Sie die zwischengespeicherten Ebenen bis zu dem Zeitpunkt verwenden, an dem Sie den Anwendungscode in das Bild einfügen.

109
helmbert

Dies wird direkt in Dockers eigenem " Best Practices zum Schreiben von Dockerfiles " erwähnt:

Wenn Sie über mehrere Dockerfile-Schritte verfügen, die unterschiedliche Dateien aus Ihrem Kontext verwenden, KOPIEREN Sie diese einzeln und nicht alle auf einmal. Dadurch wird sichergestellt, dass der Build-Cache jedes Schritts nur dann ungültig wird (und der Schritt erneut ausgeführt werden muss), wenn sich die speziell erforderlichen Dateien ändern.

Beispielsweise:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

Führt zu weniger Cache-Invalidierungen für den RUN-Schritt als beim Kopieren./tmp/davor.

27
jrc