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

Abh*_*doi 8 docker dockerfile

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

我的问题的替代解释:

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

Jos*_*iah 14

这对我来说似乎很可靠,因为它解决了入口点冲突并确保输出到标准输出。它还在收集数据后立即杀死容器以保持清洁,几乎与根本不运行它一样好。我希望它会帮助别人。

docker run -it --rm -a stdout --entrypoint cat <image> <filename>
Run Code Online (Sandbox Code Playgroud)

如果你经常这样做,也很容易别名。将第一行添加到您的~/.bash_aliases~/.bashrc.

$ alias dcat='docker run -it --rm -a stdout --entrypoint cat'
$ dcat <image> <filename>
Run Code Online (Sandbox Code Playgroud)


shi*_*zhz 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"
Run Code Online (Sandbox Code Playgroud)

建立形象

? ~/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
Run Code Online (Sandbox Code Playgroud)

现在,构建过程将在此处停留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
Run Code Online (Sandbox Code Playgroud)

进去检查一下内容:

? ~/ docker exec -it serene_gates sh
/ # cd /root/
~ # ls
prod.json
~ # cat prod.json
["name": "docker"]
Run Code Online (Sandbox Code Playgroud)