如何捕捉泊坞窗图像内的文件?
假设Dockerfile中有40个步骤。 想象一下你改变一个文件(比如说prod.json
),并在运行docker docker build
命令时重新运行prod.json
的第三步。 由于docker build
需要一分钟时间才能运行,有没有办法在当前的docker镜像中查看prod.json
文件的内容。 这将允许我决定是否重builddocker图像。
我的问题的替代解释:
- 运行
docker build
来创build带有标记service
的docker镜像(称为v1) - 更改需要
prod.json
中的第三步重新运行的文件(比如说prod.json
)(从而使caching失效) - 运行
docker build
来创build具有标记service
docker映像(称为v2) - rest一下,1小时后回来
- 如果当前的版本有第二步中包含的更改,就会感到困惑 – 在这个阶段有没有一些方法可以直接从Docker镜像捕获文件而不运行容器?
当你做docker build
,docker将启动一个中间容器,并在里面运行你的命令,然后在完成过程后,容器将被删除。 所以,如果你想检查一些文件的内容,而图像仍在build设中,只需docker exec -it <intermediate_container_id> /bin/bash
并检查它。
这里有一个详细的例子:
Dockerfile与模拟长build立过程 :
FROM alpine:3.3 RUN echo '["name": "docker"]' > /root/prod.json RUN echo "prod.json modified, start long build process" && sleep 120 && echo "Long build process finished"
build立图像
~/test/long-build-dockerfile/ [test1*] docker build -t long-running-build . Sending build context to Docker daemon 2.048 kB Step 1/3 : FROM alpine:3.3 ---> 6c2aa2137d97 Step 2/3 : RUN echo '["name": "docker"]' > /root/prod.json ---> Running in 4045ab129add ---> f5d21892fa51 Removing intermediate container 4045ab129add Step 3/3 : RUN echo "prod.json modified, start long build process" && sleep 120 && echo "Long build process finished" ---> Running in dd45b269efda prod.json modified, start long build process
现在构build过程将在此停留120秒,然后打开另一个terminal并find中间容器:
~/ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd45b269efda f5d21892fa51 "/bin/sh -c 'echo ..." 11 hours ago Up 4 seconds serene_gates
进入并检查内容:
~/ docker exec -it serene_gates sh / # cd /root/ ~ # ls prod.json ~ # cat prod.json ["name": "docker"]