Cada vez que Docker ejecuta con éxito un RUN
comando desde un Dockerfile, se confirma una nueva capa en el sistema de archivos de imagen . Convenientemente, puede usar esos identificadores de capas como imágenes para iniciar un nuevo contenedor.
Tome el siguiente Dockerfile:
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
y construirlo:
$ docker build -t so-2622957 .
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
Ahora puede comenzar un nuevo contenedor de 00f017a8c2a6
, 044e1532c690
y 5bd8172529c1
:
$ 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
por supuesto, es posible que desee iniciar un shell para explorar el sistema de archivos y probar comandos:
$ 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
Cuando falla uno de los comandos de Dockerfile, lo que debe hacer es buscar la identificación de la capa anterior y ejecutar un shell en un contenedor creado a partir de esa identificación:
docker run --rm -it <id_last_working_layer> bash -il
Una vez en el contenedor:
- pruebe el comando que falló y reproduzca el problema
- luego arregla el comando y pruébalo
- finalmente actualice su Dockerfile con el comando fijo
Si realmente necesita experimentar en la capa real que falló en lugar de trabajar desde la última capa de trabajo, vea la respuesta de Drew .
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
esos son