【问题标题】:How can I edit an existing docker image metadata?如何编辑现有的 docker 图像元数据?
【发布时间】: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 暴露端口。

标签: docker metadata dockerfile


【解决方案1】:

它有点老套,但很有效:

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

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

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

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

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

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

【讨论】:

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

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

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

【讨论】:

  • 对我来说效果很好,很方便。谢谢!
猜你喜欢
  • 2015-09-07
  • 2020-05-05
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
相关资源
最近更新 更多