Immer wenn Docker erfolgreich einen RUN
-Befehl aus einem Dockerfile ausführt, wird eine neue Schicht im Image-Dateisystem committed. Sie können bequem diese Schicht-IDs als Images verwenden, um einen neuen Container zu starten.
Betrachten Sie das folgende Dockerfile:
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
und bauen Sie es: (Sie können die Image-Layer-ID sehen, wenn Sie DOCKER_BUILDKIT=0 setzen)
$ DOCKER_BUILDKIT=0 docker build -t so-26220957 .
Sending build context to Docker daemon 47.62 kB
Step 1/3 : FROM busybox
---> 00f017a8c2a6
Step 2/3 : RUN echo 'foo' > /tmp/foo.txt
---> Running in 4dbd01ebf27f
---> 044e1532c690
Removing intermediate container 4dbd01ebf27f
Step 3/3 : RUN echo 'bar' >> /tmp/foo.txt
---> Running in 74d81cb9d2b1
---> 5bd8172529c1
Removing intermediate container 74d81cb9d2b1
Successfully built 5bd8172529c1
Sie können jetzt einen neuen Container mit 00f017a8c2a6
, 044e1532c690
und 5bd8172529c1
starten:
$ docker run --rm 00f017a8c2a6 cat /tmp/foo.txt
cat: /tmp/foo.txt: No such file or directory
$ docker run --rm 044e1532c690 cat /tmp/foo.txt
foo
$ docker run --rm 5bd8172529c1 cat /tmp/foo.txt
foo
bar
Sie könnten natürlich auch eine Shell starten, um das Dateisystem zu erkunden und Befehle auszuprobieren:
$ docker run --rm -it 044e1532c690 sh
/ # ls -l /tmp
total 4
-rw-r--r-- 1 root root 4 Mar 9 19:09 foo.txt
/ # cat /tmp/foo.txt
foo
Wenn einer der Befehle im Dockerfile fehlschlägt, müssen Sie nach der ID der vorherigen Schicht suchen und eine Shell in einem Container mit dieser ID starten:
docker run --rm -it bash -il
Sobald Sie im Container sind:
- versuchen Sie den fehlgeschlagenen Befehl auszuführen und das Problem zu reproduzieren
- dann korrigieren Sie den Befehl und testen ihn
- aktualisieren Sie schließlich Ihr Dockerfile mit dem korrigierten Befehl
Wenn Sie wirklich in der tatsächlichen Schicht experimentieren müssen, die fehlgeschlagen ist, anstatt von der zuletzt funktionierenden Schicht aus zu arbeiten, sehen Sie Drews Antwort.
UPDATE
Zwischencontainer-Hashes werden seit Docker-Version 20.10 nicht mehr unterstützt. Siehe Jannis Schönlebers Antwort.