Was ist der Zweck von "Docker Build - Pull"?

17

Wenn Sie ein Docker-Image erstellen, verwenden Sie normalerweise docker build ..

Aber ich habe festgestellt, dass Sie angeben können --pull, so dass der gesamte Befehl aussehen würdedocker build --pull .

Ich bin mir nicht sicher über den Zweck von --pull. In der offiziellen Dokumentation von Dockers heißt es: "Versuchen Sie immer, eine neuere Version des Bildes abzurufen", und ich bin mir nicht sicher, was dies in diesem Zusammenhang bedeutet.

Sie verwenden docker build, um ein neues Image zu erstellen und es schließlich irgendwo in einer Containerregistrierung zu veröffentlichen. Warum sollten Sie etwas ziehen wollen, das es noch nicht gibt?

Ich würde erwarten, dass so etwas "Einfaches" im Web leicht zu finden ist, aber niemand scheint eine ähnliche Frage zu haben wie diese. Der einzige wirkliche Treffer bei Google bezieht sich auf die offiziellen Dokumente von Dockers, die ich (wie oben angegeben) nicht verstehe.

Danke für Ihre Hilfe!

Jim Aho
quelle

Antworten:

17

Es wird die neueste Version aller Basis-Images abgerufen, anstatt alles, was Sie bereits lokal markiert haben, wiederzuverwenden

Nehmen Sie zum Beispiel ein Bild, das auf einem sich bewegenden Tag basiert (z. B. ubuntu:bionic). upstream nimmt dies regelmäßig vor und erstellt es neu. Möglicherweise haben Sie jedoch ein monatelang altes Image vor Ort. Docker wird gerne gegen die alte Basis bauen. --pullwird als Nebeneffekt gezogen, so dass Sie gegen das neueste Basis-Image bauen

Es ist normalerweise eine bewährte Methode, um so schnell wie möglich Upstream-Sicherheitskorrekturen zu erhalten (anstatt veraltete, potenziell anfällige Bilder zu verwenden). Sie müssen jedoch wichtige Änderungen abwägen (und wenn Sie unveränderliche Tags verwenden, macht dies keinen Unterschied).

Anthony Sottile
quelle
Dies ist eine sehr gute Erklärung für das ubuntu:bionicBild, da es (offensichtlich) keine angehängte Version hat, aber immer noch anders ist, wenn ein neues Bild veröffentlicht wird. Alles macht Sinn. Vielen Dank!
Jim Aho
1
Wenn das Basis-Image ubuntu:0.1.0zum Beispiel wäre und sie ein neues Image mit derselben Version veröffentlicht hätten, dh ubuntu:0.1.0- bedeutet dies, docker build --pulldass das gesamte neue Image erneut heruntergeladen wird? (was die meisten Leute bevorzugen würden, denke ich)
Jim Aho
Ich hoffe, jemand wird die letzte Frage von @JimAho klären, denn das möchte ich auch besser verstehen. Wenn das Bild gerade verschoben wurde und sich nichts anderes geändert hat, wird es dann nicht neu erstellt?
learning2learn
2
@ learning2learn die Antwort ist ja, das Tag eines Docker-Bildes ist nur eine Zeichenfolge, daher unterscheidet sich "0.1.0" nicht von dem Beispiel in der Antwort "bionic"
Anthony Sottile
@ AnthonySottile Danke. sehr viel.
learning2learn
1

Einfache Antwort. docker buildwird verwendet, um aus einer lokalen Docker-Datei zu erstellen.docker pullwird verwendet, um vom Docker-Hub zu ziehen. Wenn Sie Docker Build ohne Docker-Datei verwenden, wird ein Fehler ausgegeben.

Wenn Sie angeben --pulloder :latestDocker versucht, die neueste Version herunterzuladen (falls vorhanden)

Wenn Sie --pull hinzufügen, wird grundsätzlich versucht, bei jeder Ausführung die neueste Version abzurufen.

DuDoff
quelle
Wenn Sie Bilder überlagert haben - werden sie immer alle ziehen ?
Jim Aho
Wenn Sie Bilder mit Ebenen überlagert haben, werden einige auf dem Computer zwischengespeichert (ältere Ebenen) und alle neuen Ebenen werden gezogen.
DuDoff
0

Docker ermöglicht die Weitergabe der  --pull Flagge an  docker builddocker build . --pull -t myimage. Dies ist die empfohlene Methode, um sicherzustellen, dass der Build trotz der lokal verfügbaren Version immer das neueste Container-Image verwendet. Ein weiterer erwähnenswerter Punkt:

Verwenden Sie beim Erstellen die folgenden Optionen, um sicherzustellen, dass Ihr Build vollständig neu erstellt wird, einschließlich der Überprüfung des Basisimages auf Aktualisierungen:

--no-cache - Dadurch wird die Wiederherstellung bereits verfügbarer Ebenen erzwungen.

Der vollständige Befehl sieht daher folgendermaßen aus:

docker build . --pull --no-cache --tag myimage:version

Die gleichen Optionen stehen zur Verfügung für docker-compose:

docker-compose build --no-cache --pull

Auf Wiedersehen_für_now
quelle
Im normalen Gebrauch sollten Sie nicht brauchen --no-cache. Wenn das Basis-Image aktualisiert wird (und --pulleine neue Version erhält), wird der Cache automatisch ungültig. Ähnliches gilt, wenn Sie einen COPYanderen Code verwenden, der den Cache ungültig macht. Dies wirkt sich normalerweise nur aus, wenn Sie so etwas wie apt-get installein im Netzwerk gehostetes Paket ausführen. In diesem Fall --no-cachewird nach einer neueren Version gesucht, auch wenn das Basis-Image nicht aktualisiert wurde.
David Maze