如何在Docker镜像中查看文件?

23
假设Dockerfile有40个步骤。设想一种情况,你更改了一个文件(比如prod.json),并在运行docker build命令时重新运行了Dockerfile中的第3个步骤。由于docker build需要超过1分钟的时间来运行,是否有一种方法可以查看当前docker镜像中文件prod.json的内容。这将使我能够决定是否重新构建docker镜像。 我的问题的备选说明:
  1. 运行docker build命令创建带标记service的docker镜像(称为v1)。
  2. 更改一个文件(例如prod.json),该文件需要重新运行Dockerfile中的第三个步骤(从而失败缓存)。
  3. 运行docker build命令创建带标记service的docker镜像(称为v2)。
  4. 休息1小时后回来。
  5. 如果当前构建包含您在第2步中包含的更改,则会感到困惑-是否有一些直接从docker镜像读取文件的方法,而不必在此阶段运行容器?

1
你不能重新构建这个镜像吗?如果它已经是最新的,由于缓存的原因,这将会很快。 - Henry
2个回答

21

我发现这种方法非常可靠,它解决了入口点冲突并确保输出到标准输出。获取数据后,它还会立即终止容器以保持整洁,几乎就像没有运行一样。我希望它能对其他人有所帮助。

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

如果您需要频繁使用该命令,还可以将其设置为别名。将第一行添加到您的~/.bash_aliases~/.bashrc文件中即可。

$ alias dcat='docker run -it --rm -a stdout --entrypoint cat'
$ dcat <image> <filename>

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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接