So erstellen Sie ein Docker-Image aus einem laufenden Container

0
396

Docker-Container sind im Allgemeinen flüchtige Anwendungsinstanzen ohne internen Status. Das ist die bewährte Methode, um damit umzugehen, sodass Sie Ihre Container jederzeit stoppen oder neu starten können.

Manchmal sind Änderungen am Dateisystem eines Containers jedoch unvermeidlich. Vielleicht probieren Sie Software aus und möchten einen Schnappschuss, zu dem Sie später zurückkehren können. Ein weiterer Anwendungsfall könnten Situationen sein, in denen die Software in einem Container nicht mehr funktioniert und Sie eine Replik speichern möchten, die Sie in Zukunft debuggen können.

So erstellen Sie ein neues Docker-Image aus einem vorhandenen Container. Sie können dann einen weiteren Container aus diesem Image starten, der mit dem Dateisystem des ersten gefüllt wird.

Container festschreiben

Der Befehl docker commit wird verwendet, um einen Container zu nehmen und daraus ein neues Image zu erstellen. Es funktioniert sowohl mit angehaltenen als auch mit laufenden Containern.

Die grundlegende Syntax lautet wie folgt:

docker commit example-container example-image:latest

Dadurch wird ein Image aus dem Container mit dem Namen example-container erstellt. Sie können den Container auch anhand der ID identifizieren, wenn Sie dies bevorzugen. Beide Informationen sind in der Ausgabe von docker ps verfügbar, die alle Container auf Ihrem Host auflistet.

Werbung

Dem resultierenden Bild wird das als zweiter Parameter des Befehls angegebene Tag zugewiesen. Dies ist example-image:latest im oben gezeigten Beispiel. Genau wie bei einem normalen Bild-Tagging-Vorgang ersetzt das neue Bild die Referenz des Tags, falls sie bereits vorhanden ist.

Jetzt können Sie Ihr Image verwenden, um das Dateisystem aus example-container in einer neuen Containerinstanz wiederherzustellen:

docker run -d example-image:latest

Der Inhalt des Dateisystems stimmt mit dem Beispiel-Container-Container zum Zeitpunkt der Ausführung des Docker-Commit-Befehls überein. Es gibt einen wichtigen Vorbehalt: Der Inhalt von gemounteten Volumes wird nicht eingeschlossen, sodass ihre Mount-Speicherorte im erstellten Container-Image leer sind. Um einen neuen Container mit intakten Volume-Daten auszuführen, verwenden Sie das Flag -v, um die Volumes aus dem ersten Container neu anzuhängen, wenn Sie die zweite Instanz mit docker run starten.

Ein weiterer bemerkenswerter Knackpunkt ist, wie Docker mit Commits von laufenden Containern umgeht. Zum größten Teil sollte dies nahtlos funktionieren, aber standardmäßig wird der Zielcontainer angehalten, bevor das Commit erstellt wird. Alle Prozesse innerhalb des Containers werden angehalten und nach Abschluss der Image-Erstellung wieder aufgenommen. Dadurch wird die Datenkonsistenz im neuen Image verbessert, der Container bleibt jedoch vorübergehend unzugänglich. Sie können dieses Verhalten deaktivieren, indem Sie –pause false in Ihren Docker-Commit-Befehl einfügen.

Hinzufügen von Commit-Nachrichten

Der Docker-Commit-Befehl unterstützt Commit-Nachrichten in ähnlicher Weise wie Versionskontrollsoftware wie Git. Wenn Sie beim Erstellen eines Images aus einem Container eine Nachricht hinzufügen, können Sie dokumentieren, was sich geändert hat, und den Grund für Ihren Commit.

Verwenden Sie das Flag –message oder -m, um eine Commit-Nachricht anzuwenden:< /p>docker commit -m “Beispiel-Commit” Beispiel-Container Beispiel-Bild:neueste Anzeige

Sie können auch Informationen zur Urheberschaft mit einem speziellen Flag hinzufügen. Geben Sie eine Zeichenfolge im allgemeinen Vornamen <email@example.com> format an das Flag –author oder -a. Es wird zusammen mit der Commit-Nachricht gespeichert.

docker commit -a “Example Author <example@example.com>” -m “Beispiel-Commit” Beispiel-Container Beispiel-Bild:neuestes

Commit-Meldungen werden angezeigt, wenn Sie den Docker-Verlaufsbefehl verwenden, um die Ebenen in einem Bild anzuzeigen. Sie werden ganz rechts in der Spalte COMMENT angezeigt.

Eine andere Möglichkeit, auf diese Informationen zuzugreifen, besteht darin, docker inspect zusammen mit grep zu verwenden, um Urheber- und Kommentarwerte aus der JSON-Darstellung eines Bildes zu extrahieren:

docker inspect <image-id> | grep 'Erstellt|Autor|Kommentar'

Hier werden die Daten angezeigt, die mit der obersten Ebene im Image verknüpft sind.

Anweisungen zum Ändern von Dockerfiles

Durch Festschreiben eines Images erhalten Sie eine Chance, einige seiner Dockerfile-Anweisungen zu mutieren. Sie können die folgenden Werte in Ihrem neuen Bild überschreiben:

  • CMD
  • ENTRYPOINT
  • ENV
  • EXPOSE
  • LABEL
  • ONBUILD
  • USER
  • VOLUME
  • WORKDIR

Um eine Anweisung zu setzen, verwenden Sie das Flag –change oder -c:

docker commit –change 'ENTRYPOINT [“sh”]' example-container example-image:latest Advertisement

Sie können es wiederholen das Flag so oft wie nötig, um alle beabsichtigten Änderungen zu übernehmen.

Es werden nur Anweisungen unterstützt, die sich auf die oberste Dateisystemschicht auswirken. Sie können ein festgeschriebenes Bild nicht nahtlos mit neuen Ebenen über Anweisungen wie RUN und COPY erweitern. Sie könnten jedoch das Ergebnis eines Commit nehmen und eine neue Docker-Datei schreiben, die bei Bedarf neue Inhalte hinzufügt:

# Erstellt über `docker commit` FROM example-image:latest RUN apt install example-package

Falls Sie dies tun Wenn Sie Dockerfile-Anweisungen zum Commit-Zeitpunkt ändern, lohnt es sich, eine Commit-Nachricht hinzuzufügen, die erklärt, was Sie ändern und warum. Dies wird allen anderen mit Zugriff auf das Bild helfen, Verhaltensunterschiede im Vergleich zu dem Container, aus dem es erstellt wurde, zu verstehen.

Zusammenfassung

Docker-Images werden normalerweise aus Dockerfiles erstellt und zum Starten von Einwegcontainern verwendet. Änderungen am Zustand des Dateisystems eines Containers werden vorgenommen, indem das Image neu erstellt, der vorhandene Container zerstört und ein neuer gestartet wird. In einer idealen Welt haben Container keinen internen Status, aber das ist in der Praxis nicht immer der Fall.

Durch das Festschreiben eines Containers haben Sie die Möglichkeit, sein aktuelles Dateisystem in Zukunft wiederherzustellen. Commits sind nützlich, um Repliken von problematischen Containern zu erstellen, damit Sie in einer separaten Umgebung debuggen können, während Sie den Zugriff auf zuvor generierte Protokolle und temporäre Dateien behalten.

Obwohl Container-Commits sich oft wie VM-Snapshots anfühlen, sind sie keine’ t ganz dasselbe. VMs steuern virtuelle Hardware, und der Status dieser Hardware wird im Snapshot angezeigt. Docker-Container sind nur eine Reihe von Prozessen, die auf dem Host ausgeführt werden. Ein Commit ist ein neues Docker-Image, das das Dateisystem des Containers darstellt, aber notwendigerweise keine Daten über den Status von Prozessen, dem Kernel und Ihrer Hardware enthält.