2017-10-25 4 views
1

supposse des let Ich habe einen Dockerfile wie folgt aus:Kann ein Docker Layer beim Build "umgangen" werden?

FROM debian:stretch 

RUN apt update 
RUN apt install -y wget 

RUN wget https://stackoverflow.com/ 
# I know the wget is useless. Is just an example :) 
CMD ["echo", "hello-world"] 

ich die wget Anweisung, eine neue RUN-Anweisung gestülpt werden soll. Nach dieser Änderung, wenn ich neu aufbaue, wird es alle Befehle von meiner Modifikation nach unten ausführen, so dass das wget erneut ausgeführt wird. Das Problem ist, dass der Befehl wget so viel Zeit braucht, um fertig zu werden, da die Datei in meiner realen Datei eine sehr große Datei ist.

Die Frage ist, kann Docker "irgendwo zwickt" werden, um beim Aufbau der Ausführung der Wget-Schicht zu vermeiden? Wenn ich es schon gebaut habe, kann diese Schicht wieder verwendet werden, sogar eine Aussage darüber ändern?

Vielen Dank.

Antwort

2

AFAIK dies ist nicht möglich, da Docker nur die Schichten bis zu Ihrer Änderung wiederverwendet und von dort aus wieder zu bauen beginnt.

Dies liegt daran, dass die neuen Layer auf den zuvor erstellten Layern getestet werden (so dass Ihre RUN wget Layer auf den Layern von FROM bis RUN apt install -y wget getestet und erstellt wurde). Wenn Sie also eine weitere Anweisung RUN über die Anweisung RUN wget eingeben, erhalten Sie eine geänderte Umgebung für Ihre Anweisung RUN wget, sodass sie erneut ausgeführt werden muss.

Ich glaube nicht, dass es eine Möglichkeit gibt, damit manuell zu zappeln, so dass es die Ebene, die auf einer "anderen" Umgebung gebaut wurde, wiederverwenden würde und ich würde es auch nicht empfehlen.

1

Mit docker-compose oder dem Flag -v bei der Ausführung von docker run können Sie ein Volume mounten, das zwischen den Läufen bestehen bleibt. Ändern Sie Ihr wget in ein Skript, das in Abwesenheit der Datei bedingt ausgeführt wird.

Das wird den späteren Cache nicht speichern, aber diesen Schritt schneller machen.

Sie müssen möglicherweise den Ordner ändern, in dem Sie diese Datei speichern, abhängig vom Rest Ihres Skripts und wie Ihre Umgebung eingerichtet ist.

ich komponieren mit für Volumen Montage hier: https://github.com/jaydorsey/ghgvcR/blob/master/docker-compose.yml

Blick auf die bin/download-files.sh Datei in diesem Repo für ein Bash-Beispiel.

Verwandte Themen