In einer Docker-Datei habe ich eine Ebene, die installiert requirements.txt
:
FROM python:2.7
RUN pip install -r requirements.txt
Wenn ich das Docker-Image erstelle, wird der gesamte Prozess ausgeführt, unabhängig von Änderungen, die an dieser Datei vorgenommen wurden.
Wie stelle ich sicher, dass Docker nur ausgeführt wird, pip install -r requirements.txt
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))
python
docker
dockerfile
Prometheus
quelle
quelle
docker build
(und IhrerDockerfile
). Vermutlich ist es ein früherer Schritt in Ihrem Erstellungsprozess, der den Cache sprengt und dazu führt, dass dieser Schritt ausgeführt wird.Antworten:
Ich gehe davon aus, dass Sie irgendwann in Ihrem Erstellungsprozess Ihre gesamte Anwendung mit
COPY
oder in das Docker-Image kopierenADD
:Das Problem ist, dass Sie den Docker-Build-Cache 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 empfehlen, nur die
requirements.txt
Datei in einem separaten Erstellungsschritt zu kopieren , 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 Punkt verwenden, an dem Sie Ihren Anwendungscode zum Bild hinzufügen.
quelle
COPY
es für vorzuziehen, esADD
sei denn, Sie benötigen ausdrücklich das Verhalten vonADD
.ADD
wird nur benötigt, wenn der<src>
Ordner ein Archiv enthält, das entpackt werden muss oder die Remote-URL-Behandlung unterstützen muss. {Quellcode}Dies wird direkt in Dockers eigenen " Best Practices zum Schreiben von Docker- Dateien " erwähnt:
quelle
Alternativ können Sie als schnelleres Mittel zum Ausführen der Datei "require.txt" ohne Eingabe von "yes" zur Bestätigung der Installation von Bibliotheken Folgendes neu schreiben:
COPY requirements.txt ./ RUN pip install -y -r requirements.txt COPY ./"dir"/* .
quelle