我可以运行 Docker 镜像的中间层吗?

问题描述 投票:0回答:6

当我从存储库获取 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 dockerfile
6个回答
36
投票

您可以运行 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 映像作为容器运行


8
投票

好吧,如果最终镜像是在同一台主机上本地构建的,那么您可以运行关联的镜像。 每层都会有一个与之关联的中间镜像。您可以通过运行

docker history <image-id>

显示这些图层及其相关图像

从注册表中提取的图像不会有这个。在这种情况下,

docker history
将显示值
<missing>
,以指示没有与这些图层关联的图像。因此没有什么可运行的。

docker pull
输出的摘要是各层的摘要,不是中间图像,无法运行。

这是一个典型场景:

  1. 您在主机上构建图像:中间图像将是 为每个层创建(这是为 docker 构建缓存完成的)
  2. 将映像推送到注册表:仅推送最终映像(引用所有层),但不会推送任何中间映像。
  3. 您将镜像拉到另一台主机上: 现在只有最终镜像在另一台 Docker 主机上可用。

您可以在 explaining-docker-image-ids 阅读有关层的更多信息。


5
投票

多年以后,我才回来回答这个问题。 要查看中间层,最好和最简单的解决方案是将 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/
[...]

3
投票

是的,这是可能的,但如果您使用 Docker 1.10 或更高版本,则只能使用自构建映像。例如,对于除最顶层之外的所有层,

docker history ruby
都会输出
<missing>
,因为它们没有标签。

如果您自己构建它,它们将有一个标签,您可以像平常一样启动它们。


2
投票

目前最流行的检查图像图层的工具是 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}

0
投票

注释掉我想测试的

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

旧版本具有可运行的中间容器映像。就像最初问的那样,新版本没有。

© www.soinside.com 2019 - 2024. All rights reserved.