当前位置: 首页 > 知识库问答 >
问题:

如何使用docker文件中保存为tar文件的docker图像作为父图像

严宇
2023-03-14

我正在将图像保存到tar文件中,如下所示

< code>docker保存我的图像:最新

FROM scratch
ADD myimage.tar.gz

但是构建失败了。有人能帮我一下吗?如何在Dockerfile中发送tar文件?

共有2个答案

卫学真
2023-03-14

有趣的是,图像保存在< code>manifest.json中,其中包含一个图像层列表,以及每个< code>tar层的路径。您可以将层< code >添加到< code >暂存图像。

公共< code>ubuntu:20.04的< code>manifest.json包含在从< code>docker保存生成的< code>tar文件中:

[
  {
    "Config": "4e2eef94cd6b93dd4d794c18b45c763f72edc22858e0da5b6e63a4566a54c03c.json",
    "RepoTags": [
      "ubuntu:20.04"
    ],
    "Layers": [
      "6d0f49bfc6be64bfab1f9c1fd2ed975f1b31300932f6e6a58431eba145aeef1f/layer.tar",
      "168251688b4a0d65c58c010d18c2e5e7bc7b1288e30e54f651e683fe7af5983c/layer.tar",
      "a48aad357767ae0e674c26ed749956078c003949bcd931af931dfc272cc96a9c/layer.tar",
      "a9d70cfea3838f5442dce79f10ea881c4705f3bbc1123a73317f90d0958341fb/layer.tar"
    ]
  }
]

…图层可以添加到从零开始构建的新图像

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

注意:从父映像设置< code>CMD和< code > ENV ——配置可以在< code>manifest.json的< code>Config键引用的文件中找到。

...如果我们 Docker 检查图像并将其与原始图像进行比较,则图层几乎完全相同:

…<code>ubuntu:20.04</code>映像的最后一层包含<code>/run/systemd/container</code>配置-生成映像中的文件<code>md5sum</code>与原始映像的文件相同,但层哈希不同-否则保存在配置文件中的映像历史记录将丢失(如果您从ubuntu:20.04</code>启动<code>,扩展图像,保存图像,解压缩文件并检查配置,则历史记录已完成)。

您可以随意扩展< code>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"]
祁渊
2023-03-14

如果您有一个泊坞保存压缩包,则需要在使用之前加载泊坞加载它。当您这样做时,这将打印出已加载图像的名称和标签。然后,您可以在 Docker 文件的 FROM 行中使用它,就像任何其他本地映像一样。

$ docker load -i myimage.tar.gz

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

如果您< code>docker推送或< code>docker保存结果图像,它将拥有原始图像的完整副本。

(在正常操作中,您不需要Docker保存,而更喜欢像Docker Hub这样的注册表服务,像GCR / ACR / ECR这样的云托管服务,或者运行自己的注册表服务。您不能真正直接将保存的图像 tarfile 用于任何内容。

 类似资料:
  • 我必须将一个在几个容器中运行的应用程序交付给一个客户。我可以用 我的目标是交付一个只有docker-compose.yml和图像(app1.tar,app2.tar...)的zip文件夹需要运行集装箱。

  • 我想了解在使用内部文件时编写java项目的最佳技术或标准技术。准确地说,我想开发一个使用程序运行时需要的文本文件和图像的项目。我的目标是从项目中创建一个可运行的jar,其中用户不需要看到所有这些文件。因此,我决定创建一个名为resources的包,并将其放在包含源代码的文件夹中。即。它与其他包处于同一级别。现在,在我的代码中,当我想要使用图像时,我使用以下语句:URL URL=getClass()

  • 我们使用构建docker图像。 我的maven项目包括3个模块(、和)。每个模块基于每个模块中存在的dockerfile构建一个docker映像。 如有任何帮助,不胜感激!

  • 我正在Azure管道中构建Docker映像。现在,我想根据配置参数将此映像推送到多个aws帐户(dev,阶段,prod)。问题是,图像在发布工件中不可用。我在研究过程中偶然发现了这篇和这篇文章。我对保存docker映像的解决方案感到困惑,这样它就可以在发布工件中使用。我有两个具体问题: 在docker生成后,我将如何在Azure管道任务中使用命令。可用的docker任务没有这个命令。 除了保存图像

  • 根据Docker文档,要生成自己的映像,必须始终使用指令指定基映像。 编辑:创建基本图像的官方文档

  • 我想通过docker compose构建图像,并为其设置特定标记。文件说: Comment将构建并用生成的名称标记它,然后使用该映像。 但是我找不到指定标签的方法,对于构建的图像,我总是看到“最新”标签。