¿Cómo generar un Dockerfile a partir de una imagen?

Resuelto user1026169 asked hace 11 años • 11 respuestas

¿Es posible generar un Dockerfile a partir de una imagen? Quiero saberlo por dos razones:

  1. Puedo descargar imágenes del repositorio pero me gustaría ver la receta que las generó.

  2. 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.

user1026169 avatar Oct 01 '13 05:10 user1026169
Aceptado

¿Cómo generar o revertir un Dockerfile a partir de una imagen?

Puede. Principalmente.

Notas: No genera un archivo Dockerfileque 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.36no 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.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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
BMW avatar Jun 12 '2015 00:06 BMW

Para comprender cómo se creó una imagen acoplable, use el docker history --no-trunccomando.

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...

user6856 avatar Nov 05 '2014 23:11 user6856