Um zu verstehen, wie ein Docker-Image erstellt wurde, verwenden Sie den Befehl docker history --no-trunc
.
Sie können eine Docker-Datei aus einem Image erstellen, aber sie wird nicht alles enthalten, was Sie vollständig verstehen möchten, wie das Image generiert wurde. Vernünftigerweise können Sie die MAINTAINER, ENV, EXPOSE, VOLUME, WORKDIR, ENTRYPOINT, CMD und ONBUILD-Teile der Docker-Datei extrahieren.
Das folgende Skript sollte für Sie funktionieren:
#!/bin/bash
docker history --no-trunc "$1" | \
sed -n -e 's,.*/bin/sh -c #(nop) \(MAINTAINER .*[^ ]\) *0 B,\1,p' | \
head -1
docker inspect --format='{{range $e := .Config.Env}}
ENV {{$e}}
{{end}}{{range $e,$v := .Config.ExposedPorts}}
EXPOSE {{$e}}
{{end}}{{range $e,$v := .Config.Volumes}}
VOLUME {{$e}}
{{end}}{{with .Config.User}}USER {{.}}{{end}}
{{with .Config.WorkingDir}}WORKDIR {{.}}{{end}}
{{with .Config.Entrypoint}}ENTRYPOINT {{json .}}{{end}}
{{with .Config.Cmd}}CMD {{json .}}{{end}}
{{with .Config.OnBuild}}ONBUILD {{json .}}{{end}}' "$1"
Ich verwende dies als Teil eines Skripts, um laufende Container als Images neu zu erstellen: https://github.com/docbill/docker-scripts/blob/master/docker-rebase
Das Dockerfile ist hauptsächlich nützlich, wenn Sie ein Image neu verpacken möchten.
Was Sie im Kopf behalten sollten, ist, dass ein Docker-Image tatsächlich nur das Tar-Backup einer realen oder virtuellen Maschine sein kann. Ich habe auf diese Weise mehrere Docker-Images erstellt. Selbst die Baugeschichte zeigt mir, dass ich als ersten Schritt beim Erstellen des Images eine riesige Tar-Datei importiert habe...