如何捕捉泊坞窗图像内的文件?

假设Dockerfile中有40个步骤。 想象一下你改变一个文件(比如说prod.json ),并在运行docker docker build命令时重新运行prod.json的第三步。 由于docker build需要一分钟时间才能运行,有没有办法在当前的docker镜像中查看prod.json文件的内容。 这将允许我决定是否重builddocker图像。

我的问题的替代解释:

  1. 运行docker build来创build带有标记service的docker镜像(称为v1)
  2. 更改需要prod.json中的第三步重新运行的文件(比如说prod.json )(从而使caching失效)
  3. 运行docker build来创build具有标记service docker映像(称为v2)
  4. rest一下,1小时后回来
  5. 如果当前的版本有第二步中包含的更改,就会感到困惑 – 在这个阶段有没有一些方法可以直接从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"]