如何在docker镜像中捕获文件?

时间:2017-03-28 07:47:57

标签: docker dockerfile

假设Dockerfile中有40个步骤。想象一下你改变一个文件(比如说prod.json)并在运行docker build命令时重新运行Dockerfile中的第3步的情况。由于docker build运行时间超过一分钟,因此有一种方法可以查看当前泊坞窗图像中文件prod.json的内容。这将允许我决定是否重建docker镜像。

我的问题的替代解释:

  1. 运行docker build以创建标记为service的泊坞窗图片(将其命名为v1)
  2. 更改需要重新运行Dockerfile中第3步的文件(例如prod.json)(从而使缓存失败)
  3. 运行docker build以使用代码service创建泊坞窗图片(将其命名为v2)
  4. 休息一下,1小时后回来
  5. 如果当前版本具有您在第二步中包含的更改,请感到困惑 - 是否有某种方法直接从docker镜像捕获文件而不在此阶段运行容器?

2 个答案:

答案 0 :(得分:6)

执行docker build时,docker将启动一个中间容器并在内部运行命令,然后在完成该过程后将删除容器。因此,如果您想在图片处于构建状态时检查某些文件的内容,只需docker exec -it <intermediate_container_id> /bin/bash并进行检查。

这是一个详细的例子:

使用模拟长构建过程的Dockerfile

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"

构建图像

 ~/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

现在构建过程将在此停留120秒,然后打开另一个终端并找到中间容器:

 ~/ 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"]

答案 1 :(得分:1)

这似乎对我来说是可靠的,因为它解决了入口点冲突并确保输出到stdout。它还会在收集数据以保持环境干净之后立即杀死容器,这几乎与完全不运行容器一样好。希望对其他人有帮助。

docker run -it --rm -a stdout --entrypoint cat <image> <filename>