remove - docker run image
docker: cómo mostrar las diferencias entre 2 imágenes (6)
Cada instrucción RUN crea un nuevo contenedor y puede inspeccionar qué cambió un contenedor utilizando docker diff <container>
.
Entonces, después de compilar su archivo docker ps -a
, ejecute docker ps -a
para obtener una lista de los contenedores que creó el archivo de compilación. Debería verse algo así como:
CONTAINER ID IMAGE COMMAND CREATED STATUS ...
53d7dadafee7 f71e394eb0fc /bin/sh -c apt-get i 7 minutes ago Exit 0 ...
...
Ahora puedes hacer docker diff 53d7dadafee7
para ver qué ha cambiado.
Tengo un Dockerfile con una secuencia de instrucciones RUN que ejecutan "apt-get install" s; por ejemplo, un par de líneas:
RUN apt-get install -y tree
RUN apt-get install -y git
Después de haber ejecutado "docker build", si luego ejecuto "docker images -a", veo la lista de todas las imágenes base-child-child -.... que se crearon durante la compilación.
Me gustaría ver una lista de todos los paquetes que se instalaron cuando se ejecutó la línea "apt-get install -y git" (incluidos los paquetes dependientes que también pueden haber sido instalados, además de los paquetes git).
Nota: Creo que el comando "docker diff" muestra las diferencias entre un contenedor y la imagen desde la que se inició. En cambio, me gustaría las diferencias entre 2 imágenes (del mismo linaje): las identificaciones de imagen "árbol" y "git". es posible?
Gracias.
Este trabajó para mí:
docker run -it e5cba87ecd29 bash -c ''find /path/to/files -type f | sort | xargs -I{} sha512sum {}'' > /tmp/dockerfiles.e5cba87ecd29.txt
docker run -it b1d19fe1a941 bash -c ''find /path/to/files -type f | sort | xargs -I{} sha512sum {}'' > /tmp/dockerfiles.b1d19fe1a941.txt
meld /tmp/dockerfiles*
Donde e5cba87ecd29 y b1d19fe1a941 son imágenes que me interesan y / path / to / files es un directorio que podría ser "/". Enumera todos los archivos, los ordena y agrega hash a ellos por si acaso. Y meld resalta todas las diferencias.
Mira esto :
https://github.com/GoogleCloudPlatform/container-diff
Esta herramienta puede diferenciar las imágenes del acoplador local o remoto y puede hacerlo sin requerir que se instale el acoplador. Tiene un archivo y un nivel de paquete "diferente" (por ejemplo: apt, npm y pip) para que pueda ver más fácilmente las diferencias en los paquetes que han cambiado entre dos imágenes del acoplador.
Descargo de responsabilidad: soy un colaborador de este proyecto
Mira esto:
https://github.com/moul/docker-diff
Brew
instrucciones de instalación de Brew
para Mac, supongo que es un script Bash, así que supongo que podría funcionar en otros entornos * nix.
Si conoce la ID o el nombre del contenedor (incluso el contenedor detenido), puede volcar rápidamente la lista de archivos sobre la marcha.
$ docker export CONTAIN_ID_OR_NAME | tar tv
-rwxr-xr-x 0 0 0 0 2 6 21:22 .dockerenv
-rwxr-xr-x 0 0 0 0 2 6 21:22 .dockerinit
drwxr-xr-x 0 0 0 0 10 21 13:46 bin/
-rwxr-xr-x 0 0 0 1021112 10 8 2014 bin/bash
-rwxr-xr-x 0 0 0 31152 10 21 2013 bin/bunzip2
-rwxr-xr-x 0 0 0 0 10 21 2013 bin/bzcat link to bin/bunzip2
lrwxrwxrwx 0 0 0 0 10 21 2013 bin/bzcmp -> bzdiff
-rwxr-xr-x 0 0 0 2140 10 21 2013 bin/bzdiff
lrwxrwxrwx 0 0 0 0 10 21 2013 bin/bzegrep -> bzgrep
-rwxr-xr-x 0 0 0 4877 10 21 2013 bin/bzexe
......
Luego puede guardar la lista en el archivo y comparar también los archivos de la lista.
Si insiste en usar ID o nombre de imagen, puede volcar la lista de archivos de la primera capa sobre la marcha:
$ docker save alpine |tar xO ''*/layer.tar'' | tar tv
drwxr-xr-x 0 0 0 0 12 27 06:32 bin/
lrwxrwxrwx 0 0 0 0 12 27 06:32 bin/ash -> /bin/busybox
lrwxrwxrwx 0 0 0 0 12 27 06:32 bin/base64 -> /bin/busybox
lrwxrwxrwx 0 0 0 0 12 27 06:32 bin/bbconfig -> /bin/busybox
-rwxr-xr-x 0 0 0 821408 10 27 01:15 bin/busybox
Después de todo, le sugiero que inicie el contenedor y luego lo detenga, luego puede obtener una lista de archivos fusionados tal como se describe en la primera forma.
2017/02/01: la forma más rápida de mostrar la lista de archivos del contenedor, puede introducir su directorio raíz para leer archivos :
# PID=$(docker inspect -f ''{{.State.Pid}}'' CONTAIN_ID_OR_NAME)
# cd /proc/$PID/root && ls -lF
drwxr-xr-x 0 0 0 0 12 27 06:32 bin/
lrwxrwxrwx 0 0 0 0 12 27 06:32 bin/ash -> /bin/busybox
lrwxrwxrwx 0 0 0 0 12 27 06:32 bin/base64 -> /bin/busybox
lrwxrwxrwx 0 0 0 0 12 27 06:32 bin/bbconfig -> /bin/busybox
-rwxr-xr-x 0 0 0 821408 10 27 01:15 bin/busybox
Tenga en cuenta que si está utilizando docker-machine, primero debe ingresarlo mediante docker-machine ssh
y sudo sh
.
Ahora obtiene el directorio raíz de los dos contenedores, puede usar diff para compararlos directamente.
Supongo que podría enviar los dos sistemas de archivos de imágenes a tarballs a través de docker export CONTAINERID
o docker save IMAGEID
(actualizado según los comentarios)
Luego, use la herramienta que desee para diferenciar los sistemas de archivos: Git, Rdiff, etc.