2015-12-21 5 views
22

In einer Dockerfile habe ich eine Schicht, die requirements.txt installiert:Docker wie pip requirements.txt nur ausführen, wenn es eine Änderung gab?

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

Wenn ich das Docker Bild bauen läuft es den gesamten Prozess unabhängig von irgendwelchen dieser Datei vorgenommenen Änderungen.

Wie stelle ich sicher, dass Docker nur pip install -r requirements.txt ausführt, wenn eine Änderung an der Datei vorgenommen 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)) 
+1

Bitte poste die Ausgabe von 'docker build' (und deine' Dockerfile'). Vermutlich ist es ein früherer Schritt in Ihrem Build-Prozess, der den Cache zerstört, wodurch dieser Schritt ausgeführt wird. –

+0

Update OP mit allen, die ich im Moment habe – Prometheus

+1

Nur dieser Schritt ist nicht sinnvoll. Bitte posten Sie die * komplette * Ausgabe (oder zumindest die Dockerfile). –

Antwort

39

Ich gehe davon aus, dass Prozess an einem gewissen Punkt in Ihrem Build, sind Sie Ihre gesamte Anwendung in das Bild Docker Kopieren mit COPY oder ADD:

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

Das Problem ist, dass Sie Der Docker-Build-Cache wird jedes Mal ungültig, wenn Sie die gesamte Anwendung in das Image kopieren. Dadurch wird auch der Cache für alle nachfolgenden Build-Schritte ungültig gemacht.

Um dies zu verhindern, würde ich nur die requirements.txt Datei in einem separaten Build-Schritt, bevor die gesamte Anwendung in das Bild Hinzufügen empfehlen Kopieren:

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

Da die Anforderungen Datei selbst wohl nur selten ändert, Sie können die zwischengespeicherten Ebenen bis zu dem Punkt verwenden, an dem Sie Ihren Anwendungscode in das Bild eingefügt haben. Dies wird direkt in Docker eigenen „Best practices for writing Dockerfiles“ erwähnt

+1

Als allgemeine Richtlinie glaube ich, dass "COPY" gegenüber "ADD" vorzuziehen ist, es sei denn, Sie benötigen speziell das Verhalten von "ADD". – Metropolis

+0

@Metropolis, Sie sind völlig richtig. Danke für den Tipp. – helmbert

+1

Stimmen Sie mit @Metropolis überein. 'ADD' wird nur benötigt, wenn der Ordner' 'ein Archiv enthält, das entpackt werden muss oder die Remote-URL-Behandlung unterstützen muss. [** {Quellcode} **] (https://github.com/docker/docker/blob/670c8696a29825b23208496bd4d8e88b5faa7773/builder/dispatchers.go#L77) – Mohsin

6

:

Wenn Sie mehrere Dockerfile Schritte haben, die verschiedenen Dateien aus Ihrem Kontext zu verwenden, kopieren Sie sie einzeln, anstatt alles auf einmal. Dieser stellt sicher, dass der Build-Cache jedes Schrittes nur ungültig gemacht wird (erzwingt den Schritt erneut ausgeführt werden), wenn die speziell erforderlichen Dateien ändern.

Zum Beispiel:

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

Ergebnisse in weniger Cache Ungültigkeits für den LAUF Schritt, als wenn Sie die COPY setzen./tmp/davor.

Verwandte Themen