Mỗi khi RUN
docker thực hiện thành công một lệnh từ Dockerfile, một lớp mới trong hệ thống tệp hình ảnh được cam kết. Thuận tiện bạn có thể sử dụng các id lớp đó làm hình ảnh để bắt đầu một container mới.
Lấy Dockerfile sau:
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
và xây dựng nó:
$ 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
Bây giờ bạn có thể bắt đầu một container mới từ 00f017a8c2a6
, 044e1532c690
và 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
tất nhiên bạn có thể muốn bắt đầu một shell để khám phá hệ thống tập tin và thử các lệnh:
$ 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
Khi một trong các lệnh Dockerfile thất bại, điều bạn cần làm là tìm id của lớp trước và chạy shell trong một thùng chứa được tạo từ id đó:
docker run --rm -it <id_last_working_layer> bash -il
Khi đã ở trong container:
- thử lệnh thất bại và tái tạo vấn đề
- sau đó sửa lệnh và kiểm tra nó
- cuối cùng cập nhật Dockerfile của bạn với lệnh cố định
Nếu bạn thực sự cần thử nghiệm trong lớp thực tế thất bại thay vì làm việc từ lớp làm việc cuối cùng, hãy xem câu trả lời của Drew .
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
những thứ đó là nội bộ của Docker và tôi sẽ không gây rối với họ