ทุกครั้งที่นักเทียบท่าเรียกใช้RUN
คำสั่งจาก Dockerfile ได้สำเร็จเลเยอร์ใหม่ในระบบไฟล์รูปภาพจะถูกคอมมิต คุณสามารถใช้รหัสเลเยอร์เหล่านั้นเป็นรูปภาพเพื่อเริ่มคอนเทนเนอร์ใหม่ได้อย่างสะดวก
ใช้ Dockerfile ต่อไปนี้:
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
และสร้างมัน:
$ 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
ตอนนี้คุณสามารถเริ่มต้นคอนเทนเนอร์ใหม่จาก00f017a8c2a6
, 044e1532c690
และ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
แน่นอนคุณอาจต้องการเริ่มเชลล์เพื่อสำรวจระบบไฟล์และลองใช้คำสั่ง:
$ 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
เมื่อหนึ่งในคำสั่ง Dockerfile ล้มเหลวสิ่งที่คุณต้องทำคือค้นหาid ของเลเยอร์ก่อนหน้าและเรียกใช้เชลล์ในคอนเทนเนอร์ที่สร้างจาก id นั้น:
docker run --rm -it <id_last_working_layer> bash -il
หนึ่งครั้งในภาชนะบรรจุ:
- ลองคำสั่งที่ล้มเหลวและทำให้เกิดปัญหาอีกครั้ง
- จากนั้นแก้ไขคำสั่งและทดสอบ
- ในที่สุดก็อัพเดต Dockerfile ของคุณด้วยคำสั่งคงที่
ถ้าคุณต้องการจริงๆที่จะทดลองในชั้นที่เกิดขึ้นจริงที่ล้มเหลวแทนการทำงานจากชั้นการทำงานที่ผ่านมาดูคำตอบของ Drew
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
เหล่านี้คือ internals ของ Docker และฉันจะไม่ยุ่งกับพวกเขา