如何在Dockerfile中使用保存为tar文件的Docker镜像作为父镜像

5
我像这样将镜像保存到tar文件中:docker save myimage:latest > myimage.tar.gz,然后我尝试在Dockerfile中使用这个tar文件,类似于这样:
FROM scratch
ADD myimage.tar.gz

然而,构建过程失败了。请问有谁可以帮我解决这个问题:如何在 Dockerfile 中发送 tar 文件。

2个回答

3
如果您有一个 docker save tarball 文件,需要在使用之前使用 docker load 命令进行加载。执行该命令后,将打印出已加载的镜像名称和标签。然后,您可以像使用其他本地镜像一样,在 Dockerfile 的 FROM 行中使用它。请注意保留 HTML 标签。
$ docker load -i myimage.tar.gz

Loaded image: my/image:and-its-tag
$ head -1 Dockerfile
FROM my/image:and-its-tag

如果你使用docker pushdocker save命令,生成的镜像将完全复制原始镜像。
(在正常操作中,您不应该需要使用docker save命令;建议使用像Docker Hub这样的注册表服务,云托管服务如GCR/ACR/ECR,或者运行您自己的服务。您不能直接使用保存的镜像tar文件进行任何操作。)

我不想使用docker save,然后再使用它。我只想使用.tar.gz方式作为父镜像。 - Madhuri

1

为了好玩 - 图像保存在包含图像层路径的manifest.json中。您可以将这些层ADDscratch image中。


在由docker save生成的tar文件中包含了公共ubuntu:20.04manifest.json。保留HTML标签。
[
  {
    "Config": "4e2eef94cd6b93dd4d794c18b45c763f72edc22858e0da5b6e63a4566a54c03c.json",
    "RepoTags": [
      "ubuntu:20.04"
    ],
    "Layers": [
      "6d0f49bfc6be64bfab1f9c1fd2ed975f1b31300932f6e6a58431eba145aeef1f/layer.tar",
      "168251688b4a0d65c58c010d18c2e5e7bc7b1288e30e54f651e683fe7af5983c/layer.tar",
      "a48aad357767ae0e674c26ed749956078c003949bcd931af931dfc272cc96a9c/layer.tar",
      "a9d70cfea3838f5442dce79f10ea881c4705f3bbc1123a73317f90d0958341fb/layer.tar"
    ]
  }
]

...层可以添加到一个新的图像中,该图像是使用FROM scratch构建的:

FROM scratch
ADD 6d0f49bfc6be64bfab1f9c1fd2ed975f1b31300932f6e6a58431eba145aeef1f/layer.tar /
ADD 168251688b4a0d65c58c010d18c2e5e7bc7b1288e30e54f651e683fe7af5983c/layer.tar /
ADD a48aad357767ae0e674c26ed749956078c003949bcd931af931dfc272cc96a9c/layer.tar /
ADD a9d70cfea3838f5442dce79f10ea881c4705f3bbc1123a73317f90d0958341fb/layer.tar /
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
CMD ["/bin/bash"]

注意: 从父镜像设置CMDENV - 配置可在manifest.jsonConfig键引用的文件中找到。

docker build from layers

如果我们使用 docker inspect 命令检查镜像并将其与原始镜像进行比较,那么这些层几乎是相同的:

docker inspect image hackity-hack-hack

ubuntu:20.04镜像的最后一层中,包含/run/systemd/container配置文件 - 构建镜像中的md5sum文件与原始镜像相同,但层哈希不同 - 镜像历史记录保存在配置文件中,但丢失了(如果您从FROM ubuntu:20.04开始,扩展镜像,保存它,解压文件并检查配置,则历史记录是完整的)。

/run/systemd/container checksum

可以根据需要扩展docker镜像
FROM scratch
ADD 6d0f49bfc6be64bfab1f9c1fd2ed975f1b31300932f6e6a58431eba145aeef1f/layer.tar \
    168251688b4a0d65c58c010d18c2e5e7bc7b1288e30e54f651e683fe7af5983c/layer.tar \
    a48aad357767ae0e674c26ed749956078c003949bcd931af931dfc272cc96a9c/layer.tar \
    a9d70cfea3838f5442dce79f10ea881c4705f3bbc1123a73317f90d0958341fb/layer.tar /
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
RUN apt-get update && \
    apt-get install -y --no-install-recommends cowsay && \
    rm -rf /var/cache/apt/lists/*
CMD ["cowsay"]

docker cowsay hello world


1
当我尝试以这种方式导入图像时,会收到“错误:不支持文件路径的重复”消息。 - Veridian Dynamics

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