Was ist der Unterschied zwischen Import und Laden in Docker?

71

Ich verstehe den Unterschied zwischen export(für Container) und save(für Bilder). Aber am Ende des Tages sollte der Tarball, der entweder durch Speichern oder Exportieren erzeugt wird, als Bild verwendet werden .

Warum gibt es also zwei Befehle, um ein Bild aus einem Tarball zu machen?

rdupz
quelle

Antworten:

100

docker savewird in der Tat einen Tarball produzieren, aber mit allen übergeordneten Ebenen und allen Tags + Versionen.

docker export produziert auch einen Tarball, aber ohne Schicht / Geschichte.

Es wird oft verwendet, wenn man ein Bild "reduzieren" möchte , wie in " Einen Docker-Container oder ein Bild reduzieren " von Thomas Uhrig dargestellt :

docker export <CONTAINER ID> | docker import - some-image-name:latest

Sobald diese Tarballs hergestellt sind, können sie jedoch geladen / importiert werden:

  • docker importErstellt ein Bild aus einem Tarball, der nicht einmal ein Bild ist (nur ein Dateisystem, das Sie als Bild importieren möchten).

Erstellen Sie ein leeres Dateisystem-Image und importieren Sie den Inhalt des Tarballs

  • docker loadErstellt möglicherweise mehrere Bilder aus einem geteerten Repository (da mehrere Bilder in einem Tarball gespeichert werden docker savekönnen ).

Lädt ein geteertes Repository aus einer Datei oder dem Standardeingabestream

VonC
quelle
Ist docker image importein Synonym für docker import?
Masterxilo
Wahrscheinlich (ich bin auf meinem Handy), wenn man bedenkt, dass das Syntax-Docker-Image erst später kam.
VonC
1
Ja das ist der genaue Unterschied. Nur um hinzuzufügen, wie Docker-Import oder Docker-Image-Import ein Image aus einem Dateisystem erstellen, kann man Einstiegspunkt-, Cmd-, Run- usw. Anweisungen ändern / bereitstellen, welche Option beim Laden von Docker oder Docker-Image nicht verfügbar ist, da diese 1 / mehr erstellen Bilder, deren Ebenen und andere Verlaufsinformationen bereits erhalten sind.
Saurabhcdt
Können wir Docker-Bilder als Teere ohne die abhängigen Basisschichten speichern? Ich habe ein NodeJS-Image basierend auf dem NodeJS-Image. Wenn ich mein Image speichere, stellt sich heraus, dass die Größe aufgrund der NodeJS-Basisbildebene 800 MB beträgt. Gibt es eine Möglichkeit, die Bilder ohne das
Basisbild
1
@ NadirLaskar Nein: Dies wird unter github.com/moby/moby/issues/8039 angefordert . Es gibt eine Problemumgehung: github.com/moby/moby/issues/8039#issuecomment-480121360 , die jedoch möglicherweise nicht für Ihren speziellen Anwendungsfall gilt.
VonC
15

Als Docker-Neuling habe ich diesen Unterschied auf die harte Tour gelernt .

  • Auf einem System:

    docker run -it myImage /bin/bash
    

    -> Funktioniert gut

  • Auf demselben System (mit save ):

    docker save myImage -o myImage.tar
    
  • Auf dem zweiten System (mit Import ):

    docker import myImage.tar
    

    -> Funktioniert gut, keine Probleme, nur Tag erforderlich:

    docker tag _the_assigned_tag myImage
    
  • Auf diesem zweiten System:

    docker run -it myImage /bin/bash
    

    Docker: Fehlerantwort vom Daemon: OCI-Laufzeiterstellung fehlgeschlagen: container_linux.go: 345: Das Starten des Containerprozesses hat "exec: \" / bin / bash \ "verursacht: stat / bin / bash: keine solche Datei oder kein solches Verzeichnis": unbekannt .

Das Suchen nach diesem Fehler brachte mich zu allen möglichen Gründen wie MountFlags="slave", aber der wahre Grund stellte sich als der in diesem Beitrag beschriebene heraus: Ich hätte load anstelle von import verwenden sollen. Da Docker nicht wusste, was los war, brachte mich die Fehlermeldung von Docker in keiner Weise auf den Weg in Richtung "Import", bis ich über diesen Beitrag stolperte.

qootec
quelle
1
Haha, danke, dieser genaue Fehler hat mich nur 400 Dollar von einer nicht bestandenen Zertifizierungsprüfung gekostet. Wird diesen Fehler nicht noch einmal machen
Freedom_Ben
2

Der Docker-Import wird hauptsächlich mit einem Tarball verwendet, der aus einem laufenden Container erstellt wird. Zum Beispiel. Docker export containerID> /home/cntr.tar importieren Sie dann diesen Tarball in ein Bild, z. Docker-Import /home/cntr.tar mynewimage: tag

Während Docker Load verwendet wird, um das Bild von einem Tarball zu laden, der aus einem anderen Bild erstellt wurde. Zum Beispiel. Docker speichern> /home/fromimg.tar und dann mit Docker laden </home/fromimg.tar zurückladen

Der Hauptunterschied beim Speichern / Laden des Dockers mit dem Bild bewahrt den Bildverlauf. Während der Docker-Export / -Import mit Container das Bild glättet, indem der gesamte Verlauf des Containers entfernt wird.

Shreedhar
quelle