如何编辑现有的 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 build
或docker 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 图像元数据?的主要内容,如果未能解决你的问题,请参考以下文章