如何加载从原始 Docker 映像的 .tar 文件创建的 Docker 映像?

Posted

技术标签:

【中文标题】如何加载从原始 Docker 映像的 .tar 文件创建的 Docker 映像?【英文标题】:How can I load a Docker image created from the .tar file of an original Docker image? 【发布时间】:2021-12-23 19:57:08 【问题描述】:

我有一个 .tar 格式的 Docker 映像。当我使用sudo docker load < image.tar 加载它时,它工作正常。

我使用tar -xf image.tar 取消归档文件。然后我取消归档每个层文件,以便我可以编辑一些脚本并手动更新一些库。完成此操作后,我在每一层都使用了tar -cf,然后是整个图像。

当我以与加载原始图像相同的方式加载修改后的图像时,它不起作用。我收到此错误:

open /var/lib/docker/tmp/docker-import-742628246/image-edited/json: no such file or directory

我做错了什么导致了这个错误,我怎样才能正确地将修改后的 .tar 文件加载到 Docker 中?

P.S.:问题出现在 Docker 20.10.12 上,在 VMWare Workstation Player 内的 Kali Linux 2021.4 上运行。

【问题讨论】:

不是 100% 确定这是否是问题所在,但层被设计为不可变的。我怀疑您对这些层进行去皮、更改它们并重新去皮并没有被忽视。 @Turing85 这就是我对图层所做的。有没有办法在不导致此错误的情况下更改图层? 不确定。我宁愿写一个自定义的容器文件(或其他可重现的东西),而不是用这种方式“破解”图像。 为什么不加载图像然后构建一个新的图像,并使用本地注册表中的Dockerfile 对其进行扩展?然后,您可以根据需要导出新图像。 【参考方案1】:

我正在修改一些图像 tarball 并尝试将其加载回 docker daemon,并看到相同的错误。我试过这个:sha256sumlayer.tar在每一层,并搜索配置json文件(与manifest.json同级的另一个json文件,文件名长sha值),替换为新的 sha256 值,则此错误消失。

但是话又说回来,出现了另一个像/var/lib/docker/tmp-xxxx/xxxxx cannot open file 这样的错误,然后我认为不应该/可以在层 tar 中修改任何内容,因为我们无法以任何简单的方式绕过 docker 检查图像的完整性。

我计划使用 Google jib 工具向图像添加另一层,在其中我将一些脚本复制到执行我想要的修改的容器中,以便原始层保持不变。

【讨论】:

以上是关于如何加载从原始 Docker 映像的 .tar 文件创建的 Docker 映像?的主要内容,如果未能解决你的问题,请参考以下文章

将 Docker 容器恢复到其原始映像而不重新启动它?

从放置在本地目录中的摘要文件创建 Docker 映像

Docker:如何避免 Docker 容器中不允许的操作?

原始 IP 未传递到 AWS Elastic Beanstalk 上的单个容器 Docker 映像上的容器

docker中的dockerfile

如何控制grub从磁盘加载到内存中的内容量?