Ogni volta che la finestra mobile esegue correttamente un RUN
comando da un file Docker, viene eseguito il commit di un nuovo livello nel file system immagine . Convenientemente puoi usare questi ID di layer come immagini per avviare un nuovo contenitore.
Prendi il seguente Dockerfile:
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
e costruiscilo:
$ 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
È ora possibile avviare un nuovo contenitore da 00f017a8c2a6
, 044e1532c690
e 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
ovviamente potresti voler avviare una shell per esplorare il filesystem e provare i comandi:
$ 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
Quando uno dei comandi Dockerfile fallisce, quello che devi fare è cercare l' id del livello precedente ed eseguire una shell in un contenitore creato da quell'id:
docker run --rm -it <id_last_working_layer> bash -il
Una volta nel contenitore:
- provare il comando non riuscito e riprodurre il problema
- quindi correggere il comando e testarlo
- infine aggiorna il tuo Dockerfile con il comando fisso
Se hai davvero bisogno di sperimentare il livello effettivo che ha fallito invece di lavorare dall'ultimo livello di lavoro, vedi la risposta di Drew .
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
quelli sono interni di Docker e non mi farei un casino