如何编辑现有的 docker 图像元数据?

Posted

技术标签:

【中文标题】如何编辑现有的 docker 图像元数据?【英文标题】:How can I edit an existing docker image metadata? 【发布时间】:2017-07-08 01:58:59 【问题描述】:

出于以下原因,我想编辑 docker 图像元数据:

我不喜欢图像父母 EXPOSE、VOLUME 等声明(请参阅#3465,Docker-Team 不想提供解决方案),所以我想“取消音量”或“取消曝光”图像。

我不喜欢图像ContainerConfig(请参阅docker inspect [image]),因为它是使用docker commit [container]从正在运行的容器生成的

修复docker builddocker run 期间的错误,例如:cannot mount volume over existing file, file exists [path]

有什么办法可以做到吗?

【问题讨论】:

你需要什么来“暴露”端口? @Matt 我正在打包一个复杂的应用程序,不幸的是无法自动安装。在进行安装时,我需要将一些东西安装到容器中。完成后,我将容器提交到将用于部署应用程序的图像。不幸的是,提交将所有卷存储在安装后不需要的图像元数据中。使用元数据中的无效(旧)卷启动映像会导致 cannot mount volume over existing file, file exists 错误。这是我让事情顺利进行的工作。 卷可能会在自动发生时导致问题,并且还会在后台创建大量卷“混乱”。暴露的端口在很大程度上是良性的,因为您需要告诉 docker 暴露端口。 【参考方案1】:

它有点老套,但很有效:

    将图像保存到 tar.gz 文件:$ docker save [image] > [targetfile.tar.gz]

    解压 tar 文件以访问原始图像数据:tar -xvzf [targetfile.tar.gz]

    manifest.json 文件中查找图像元数据文件:应该有一个类似.Config 的键,其中包含一个[HEX] 数字。提取文件夹的根目录中应该有一个确切的[HEX].json。 这是包含图像元数据的文件。随意编辑。

    将提取的文件打包回new.tar.gz-archive

    使用cat [new.tar.gz] | docker load重新导入修改后的图片

    使用docker inspect [image] 验证您的元数据更改是否已应用

【讨论】:

很好的解决方法。应该注意的是,这会“折叠”图像层,因此您会丢失图像中存在的任何层共享。 我发现docker save 不会创建gzip 文件,所以我必须在tar 命令中省略-z 实际上,保存/加载确实保留了历史记录 - 至少与我用 docker-copyedit 测试过的一样。【参考方案2】:

我遇到了相同的解决方法 - 因为我必须经常编辑一些图像的元数据(修复来自第三方的自动图像重建),所以我创建了一个小脚本来帮助完成保存/解包的步骤/编辑/加载。

看看docker-copyedit。它可以删除或覆盖卷以及设置其他元数据值,如入口点和 cmd。

【讨论】:

对我来说效果很好,很方便。谢谢!

以上是关于如何编辑现有的 docker 图像元数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 iTunes 连接元数据中的图像位置? [关闭]

如何检查元数据是不是为空

如何使用现有的整数排序对整数元组进行排序?

StorageFile.GetScaledImageAsThumbnailAsync 不支持元数据旋转图像

读取 JPEG 元数据(方向)时出现问题

使用 Swift (iOS) 和 Photos 框架保存自定义图像的元数据