我可以运行docker图像的中间层吗?

ach*_*ahe 16 docker dockerfile

当我从存储库中获取一个docker图像时,看到它带有一些带有一些ID的图层但是当我尝试使用docker run运行它时它会告诉我它无法找到它.

我的问题是这样的,我可以运行一个docker图像的某层,我可以通过docker history <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
Run Code Online (Sandbox Code Playgroud)

然后 :

docker run --rm -it 5d2dc01312f3 bash
Unable to find image '5d2dc01312f3:latest' locally
Run Code Online (Sandbox Code Playgroud)

当我拉出一个我已经构建并发布的图像时,这个问题对我有用,我可以清楚地看到一层有大约1.2go的大小,而且我从我用来构建的机器上复制了一些文件的层.图像和下一层我清理并删除了一些文件,因为我正在清理图像,但图像的总大小约为1.5go,这意味着大脂肪层是1.2go是我只是想看看我是否可以窥视那个脂肪层.

a d*_*ren 8

您可以运行Docker图层的中间图像,这可能是您想要的.

在构建过程中,您可能需要在构建过程中的某个点(步骤)检查图像,例如在Docker构建输出中,您将看到:

Step 17/30 : RUN rm -rf /some/directory
---> Running in 5ab963f2b48d
Run Code Online (Sandbox Code Playgroud)

5ab963f2b48d图像ID 在哪里,当您列出图像时,您会在列表中看到该ID,例如

$ docker image ls --all
REPOSITORY    TAG      IMAGE ID       CREATED        SIZE
<none>        <none>   5ab963f2b48d   7 minutes ago  1.18GB
Run Code Online (Sandbox Code Playgroud)

例如,要运行该图像(使用终端),您可以简单地:

docker run -i -t 5ab963f2b48d /bin/bash
Run Code Online (Sandbox Code Playgroud)

另请参阅:将Docker镜像作为容器运行

  • wsl2呢?这样日志就不同了,不会出现“---&gt;运行层”。我还使用 DOCKER_BUILDKIT 和 `docker build --progress=plain` 进行了测试 (3认同)
  • 我认为这仅在您构建图像的 buid 机器中才有可能,但是您从 docker hub 注册处获取的 docker 图像怎么样? (2认同)

Ahm*_*any 5

不,你不能运行一个层。您只能运行一个图像。所以这取决于是否有与该层相关联的中间图像!

下面是一个典型的场景:

  1. 您在主机上构建映像:将为该层创建一个中间映像(这是为 docker 构建缓存完成的)
  2. 您将映像推送到注册表:仅推送最终映像(引用所有层),但不推送任何中间映像。
  3. 您在另一台主机上拉取镜像:最终镜像(包括所有层)现在在另一台 Docker 主机上可用。您可以通过运行来显示其图层docker history <image-id>

您在拉取图像时看到的摘要是层的摘要,它们不是中间图像。

输出<missing>图像列中的值docker history表示没有与这些层相关联的图像。因此,没有什么可以真正运行的。

除非镜像是在同一个 docker 主机上构建的(或者Docker 缓存是分布式的),否则 Docker 守护进程将不允许访问这些层。

您可以在解释-docker-image-ids 中阅读有关图层的更多信息。


ach*_*ahe 5

这么多年了,我回来回答这个问题。要查看中间层,最好和最简单的解决方案是将 docker 映像导出为存档格式,并且每一层都将是 docker 映像的更大 tar 内部的一个 tar 。

我们以tomcat:9.0的 docker 镜像为例 ,将其导出为 tar 格式:

docker save tomcat:9.0 >tomcat-9.0.tar
Run Code Online (Sandbox Code Playgroud)

导出时,里面有很多 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
Run Code Online (Sandbox Code Playgroud)

要查看和窥视每一层的内容,现在剩下的就是解压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/
[...]
Run Code Online (Sandbox Code Playgroud)