¿Cómo generar un Dockerfile a partir de una imagen?
¿Es posible generar un Dockerfile a partir de una imagen? Quiero saberlo por dos razones:
Puedo descargar imágenes del repositorio pero me gustaría ver la receta que las generó.
Me gusta la idea de guardar instantáneas, pero una vez que termine, sería bueno tener un formato estructurado para revisar lo que se hizo.
¿Cómo generar o revertir un Dockerfile a partir de una imagen?
Puede. Principalmente.
Notas: No genera un archivo Dockerfile
que puedas usar directamente con docker build
; el resultado es solo para su referencia.
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 nginx:latest
Extraerá la imagen de la ventana acoplable de destino automáticamente y la exportará Dockerfile
. El parámetro -sV=1.36
no siempre es necesario.
Referencia: https://hub.docker.com/r/alpine/dfimage
Ahora hub.docker.com muestra las capas de imágenes con comandos de detalle directamente, si elige una etiqueta en particular.
Prima
Si quieres saber qué archivos se modifican en cada capa
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"
dive nginx:latest
A la izquierda, ve el comando de cada capa, a la derecha (saltar con tabulador), la línea amarilla es la carpeta donde se modifican algunos archivos en esa capa.
(Utilice ESPACIO para colapsar el directorio)
Antigua respuesta
A continuación se muestra la respuesta anterior, ya no funciona.
$ docker pull centurylink/dockerfile-from-image
$ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm centurylink/dockerfile-from-image"
$ dfimage --help
Usage: dockerfile-from-image.rb [options] <image_id>
-f, --full-tree Generate Dockerfile for all parent layers
-h, --help Show this message
Para comprender cómo se creó una imagen acoplable, use el
docker history --no-trunc
comando.
Puede crear un archivo acoplable a partir de una imagen, pero no contendrá todo lo que desearía para comprender completamente cómo se generó la imagen. Razonablemente, lo que puede extraer son las partes MAINTAINER, ENV, EXPOSE, VOLUME, WORKDIR, ENTRYPOINT, CMD y ONBUILD del dockerfile.
El siguiente script debería funcionar para usted:
#!/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"
Utilizo esto como parte de un script para reconstruir contenedores en ejecución como imágenes: https://github.com/docbill/docker-scripts/blob/master/docker-rebase
Dockerfile es principalmente útil si desea poder volver a empaquetar una imagen.
Lo que hay que tener en cuenta es que una imagen de Docker en realidad puede ser simplemente la copia de seguridad tar de una máquina real o virtual. He creado varias imágenes de Docker de esta manera. Incluso el historial de compilación me muestra importando un archivo tar enorme como primer paso para crear la imagen...