假设Dockerfile中有40个步骤。想象一下你改变一个文件(比如说prod.json
)并在运行docker build
命令时重新运行Dockerfile中的第3步的情况。由于docker build
运行时间超过一分钟,因此有一种方法可以查看当前泊坞窗图像中文件prod.json
的内容。这将允许我决定是否重建docker镜像。
我的问题的替代解释:
docker build
以创建标记为service
的泊坞窗图片(将其命名为v1)prod.json
)(从而使缓存失败)docker build
以使用代码service
创建泊坞窗图片(将其命名为v2)答案 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>