当我从存储库获取 Docker 映像时,我看到它提取了一堆带有一些 id 的层,但是当我尝试使用 docker run 运行它们时,它告诉我它找不到它。
我可以运行 Docker 镜像的某一层,让我可以通过 docker 历史< image_id >看到它,就像古生物学家挖掘寻找有趣的东西一样吗?
我尝试过的:
docker pull ruby
Using default tag: latest
latest: Pulling from library/ruby
693502eb7dfb: Already exists
081cd4bfd521: Already exists
5d2dc01312f3: Already exists
54a5f7da9a4f: Pulling fs layer
168cf3f33330: Pulling fs layer
021d84fef638: Pulling fs layer
168c3c107cd1: Waiting
f001b782a027: Waiting
然后:
docker run --rm -it 5d2dc01312f3 bash
Unable to find image '5d2dc01312f3:latest' locally
当我拉取我已经构建和发布的图像时,我突然想到了这个问题。我可以清楚地看到一层的大小几乎为 1.2 GB。在这一层中,我从用于构建映像的计算机复制了一些文件,在下一层上,我在清理映像时清理并删除了其中一些文件,但映像的总大小约为 1.5 GB,意味着存在 1.2 GB 的大脂肪层。我只是想看看我是否能看到那层脂肪。
您可以运行 Docker 层的中间 image,这可能就是您想要的。
在构建过程中,您可能需要在构建过程中的某个点(步骤)检查图像,例如在 Docker 构建输出中,您将看到:
Step 17/30 : RUN rm -rf /some/directory
---> Running in 5ab963f2b48d
其中
5ab963f2b48d
是图像 ID,当您列出图像时,您会在列表中看到该 ID,例如
$ docker image ls --all
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 5ab963f2b48d 7 minutes ago 1.18GB
例如,要运行该图像(使用终端),您可以简单地:
docker run -i -t 5ab963f2b48d /bin/bash
另请参阅:将 Docker 映像作为容器运行
好吧,如果最终镜像是在同一台主机上本地构建的,那么您可以运行关联的镜像。 每层都会有一个与之关联的中间镜像。您可以通过运行
docker history <image-id>
显示这些图层及其相关图像
从注册表中提取的图像不会有这个。在这种情况下,
docker history
将显示值 <missing>
,以指示没有与这些图层关联的图像。因此没有什么可运行的。
docker pull
输出的摘要是各层的摘要,不是中间图像,无法运行。
这是一个典型场景:
您可以在 explaining-docker-image-ids 阅读有关层的更多信息。
多年以后,我才回来回答这个问题。 要查看中间层,最好和最简单的解决方案是将 docker 映像导出为存档格式,并且每一层都将是 docker 映像的更大 tar 内部的一个 tar 。
我们以 tomcat:9.0 的 docker 镜像为例 要将其导出为 tar 格式:
docker save tomcat:9.0 >tomcat-9.0.tar
导出后,里面可以发现很多Layer,每一层都存档在自己的tar文件中:
tar -tvf tomcat-9.0.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 1fdef6bff31128d5a1a41bdd5fea06be032ef59fd985da09842a252310b4afa3/
-rw-r--r-- 0/0 3 2022-09-02 12:41 1fdef6bff31128d5a1a41bdd5fea06be032ef59fd985da09842a252310b4afa3/VERSION
-rw-r--r-- 0/0 482 2022-09-02 12:41 1fdef6bff31128d5a1a41bdd5fea06be032ef59fd985da09842a252310b4afa3/json
-rw-r--r-- 0/0 20891136 2022-09-02 12:41 1fdef6bff31128d5a1a41bdd5fea06be032ef59fd985da09842a252310b4afa3/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 2ecda9f325b8b38fc5e0a2f1fed4526c517c087e909875abdf1ee4fbcab37b30/
-rw-r--r-- 0/0 3 2022-09-02 12:41 2ecda9f325b8b38fc5e0a2f1fed4526c517c087e909875abdf1ee4fbcab37b30/VERSION
-rw-r--r-- 0/0 482 2022-09-02 12:41 2ecda9f325b8b38fc5e0a2f1fed4526c517c087e909875abdf1ee4fbcab37b30/json
-rw-r--r-- 0/0 329143808 2022-09-02 12:41 2ecda9f325b8b38fc5e0a2f1fed4526c517c087e909875abdf1ee4fbcab37b30/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 2fe9b9ee40730bab9cf86153dd37fbddb4990dd09ba5b9f22e55eeae13063fe8/
-rw-r--r-- 0/0 3 2022-09-02 12:41 2fe9b9ee40730bab9cf86153dd37fbddb4990dd09ba5b9f22e55eeae13063fe8/VERSION
-rw-r--r-- 0/0 406 2022-09-02 12:41 2fe9b9ee40730bab9cf86153dd37fbddb4990dd09ba5b9f22e55eeae13063fe8/json
-rw-r--r-- 0/0 80354304 2022-09-02 12:41 2fe9b9ee40730bab9cf86153dd37fbddb4990dd09ba5b9f22e55eeae13063fe8/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 3fff0862317ff87f1d757557325c158d405afd7fd98f31544ce10cf3ad2bdaa7/
-rw-r--r-- 0/0 3 2022-09-02 12:41 3fff0862317ff87f1d757557325c158d405afd7fd98f31544ce10cf3ad2bdaa7/VERSION
-rw-r--r-- 0/0 482 2022-09-02 12:41 3fff0862317ff87f1d757557325c158d405afd7fd98f31544ce10cf3ad2bdaa7/json
-rw-r--r-- 0/0 3072 2022-09-02 12:41 3fff0862317ff87f1d757557325c158d405afd7fd98f31544ce10cf3ad2bdaa7/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 5cab171b0d1115044b08690329f32a7d99a546777097e935733a837100ef34c5/
-rw-r--r-- 0/0 3 2022-09-02 12:41 5cab171b0d1115044b08690329f32a7d99a546777097e935733a837100ef34c5/VERSION
-rw-r--r-- 0/0 482 2022-09-02 12:41 5cab171b0d1115044b08690329f32a7d99a546777097e935733a837100ef34c5/json
-rw-r--r-- 0/0 3072 2022-09-02 12:41 5cab171b0d1115044b08690329f32a7d99a546777097e935733a837100ef34c5/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 6b87b21c947802c9f53a614692b4369cc2d7aa951f64bf28cd1f8713e191894e/
-rw-r--r-- 0/0 3 2022-09-02 12:41 6b87b21c947802c9f53a614692b4369cc2d7aa951f64bf28cd1f8713e191894e/VERSION
-rw-r--r-- 0/0 482 2022-09-02 12:41 6b87b21c947802c9f53a614692b4369cc2d7aa951f64bf28cd1f8713e191894e/json
-rw-r--r-- 0/0 50671616 2022-09-02 12:41 6b87b21c947802c9f53a614692b4369cc2d7aa951f64bf28cd1f8713e191894e/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 12:41 895adbb30677e7148af6d01e295347bd6ddc7cd5d929ee8fc3d03aedac5fa857/
-rw-r--r-- 0/0 3 2022-09-02 12:41 895adbb30677e7148af6d01e295347bd6ddc7cd5d929ee8fc3d03aedac5fa857/VERSION
-rw-r--r-- 0/0 2588 2022-09-02 12:41 895adbb30677e7148af6d01e295347bd6ddc7cd5d929ee8fc3d03aedac5fa857/json
-rw-r--r-- 0/0 2048 2022-09-02 12:41 895adbb30677e7148af6d01e295347bd6ddc7cd5d929ee8fc3d03aedac5fa857/layer.tar
-rw-r--r-- 0/0 12431 2022-09-02 12:41 d4488b7f8c9b73c0f2e91f5e37990905ae3d34d55ea893b5e70b76fc7a2db1b7.json
-rw-r--r-- 0/0 661 1970-01-01 01:00 manifest.json
-rw-r--r-- 0/0 86 1970-01-01 01:00 repositories
要查看和窥视每一层的内容,现在剩下的就是解压tomcat tar,而不是解压目标层的tar。
tar -xvf tomcat-9.0.tar
tar -tvf 6b87b21c947802c9f53a614692b4369cc2d7aa951f64bf28cd1f8713e191894e/layer.tar
drwxr-xr-x 0/0 0 2022-09-02 07:24 etc/
drwxr-xr-x 0/0 0 2022-09-02 07:24 etc/ca-certificates/
-rwxr-xr-x 0/0 0 1970-01-01 01:00 etc/ca-certificates/.wh..wh..opq
drwxr-xr-x 0/0 0 2021-10-16 18:09 etc/ca-certificates/update.d/
-rw-r--r-- 0/0 5529 2022-09-02 07:24 etc/ca-certificates.conf
drwxr-xr-x 0/0 0 2022-09-02 07:24 etc/default/
-rw-r--r-- 0/0 35 2022-09-02 07:24 etc/default/locale
drwxr-xr-x 0/0 0 2022-09-02 07:24 etc/fonts/
-rwxr-xr-x 0/0 0 1970-01-01 01:00 etc/fonts/.wh..wh..opq
drwxr-xr-x 0/0 0 2022-09-02 07:24 etc/fonts/conf.avail/
[...]
是的,这是可能的,但如果您使用 Docker 1.10 或更高版本,则只能使用自构建映像。例如,对于除最顶层之外的所有层,
docker history ruby
都会输出 <missing>
,因为它们没有标签。
如果您自己构建它,它们将有一个标签,您可以像平常一样启动它们。
目前最流行的检查图像图层的工具是 dive。它在 CLI 中自动执行
docker save
和文件系统资源管理器。默认情况下,它正在检查来自本地 docker 引擎的图像,因此它通常需要访问 docker 套接字,例如:
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest ${your_image_name}
注释掉我想测试的
Dockerfile
。
docker build -t broken .
原文:
FROM node:${NODE_VERSION}-slim as base
WORKDIR /app
COPY . .
# this line is broken
RUN npm install
现在是“中间容器”:
docker build -t intermediate .
“中间”容器:
FROM node:${NODE_VERSION}-slim as base
WORKDIR /app
COPY . .
# Commented out this broken line
# so i can debug what was copied in
#RUN npm install
现在我得到了一张图像,我可以
exec
/run
-it
。
旧版本具有可运行的中间容器映像。就像最初问的那样,新版本没有。