首页 > 解决方案 > 如何记录泊坞窗图像

问题描述

我有一个 docker 映像,它接收一组环境变量来自定义其执行。

一个简单的例子是一个网络服务器,它包含诸如 OAuth2 的客户端密码、签署 cookie 的密码等内容。

整个应用程序在一个 docker 镜像上容器化,该镜像接收(运行时)环境变量。

我将该 docker 映像分发到私有注册表上,并且我想记录该映像,以便用户了解他们如何自定义映像。

作为 docker 映像的一部分,是否可以将例如使用 docker describe my_image输出降价的注释发送到标准输出?

我当然可以使用网络上的静态页面来获取文档,但用户仍然需要知道可以在哪里找到该文档,并且整个分发方式会更加复杂(例如,使用图像标签更改文档)。

有任何想法吗?

标签: docker

解决方案


据我所知,这里没有灵丹妙药,以下所有解决方案都有效,但需要告知用户如何检索文档。 没有标准的做法

开放容器倡议创建了一个图像规范注释,表明

  • 应在名为 的标签中提供指向有关图像的更多信息的链接org.opencontainers.image.documentation
  • 包装在容器内的软件的描述应在名为的标签中提供org.opencontainers.image.description

根据 OCI,以下选项 1 的变体之一是正确的。

选项 1:在标签中提供链接(OCI 首选

假设 Dockerfile 和相关资产在可公开访问的 git 存储库中进行版本控制(例如在 github 上),则该 git 存储库还可以包含 README.md 文件。如果您有一个连接到 repo 的管道,该管道自动构建 Docker 映像并将其发布到注册表,您可以设置 docker build 命令以添加带有文档链接的标签,如下所示

# Get the current commit id
commit=$(git rev-parse HEAD)

# Build docker image and attach a link to the Readme as a label
docker build -t myimagename:myversion \
--label "org.opencontainers.image.documentation=https://github.com/<user>/<repo>/blob/$commit/README.md"

此解决方案链接到与 Dockerfile 一起版本化的特定提交的特定提交文档。但是,它确实要求用户能够访问互联网才能阅读文档

选项 1b:在标签中提供完整文档(OCI 首选

选项 1 的变体,其中完整的文档被序列化并放入标签中(标签没有长度限制)。通过这种方式,文档与图像本身捆绑在一起

正如Jorge Leitao在评论中指出的那样,来自 OCI 的图像注释规范将此类标签的名称指定为org.opencontainers.image.description

选项 2:在图像中捆绑文档

如果您更喜欢将 Readme.md 文件实际捆绑在图像中以使其独立于任何外部网页,请考虑以下

在构建时,确保将 Readme.md 文件复制到 docker 映像中。另外创建一个简单的 shell 脚本describe来处理 Readme.md

描述

#!/usr/bin/env sh
cat /docs/Readme.md

Dockerfile 添加

...
COPY Readme.md /docs/Readme.md
COPY describe /opt/bin/describe
RUN chmod +x /opt/bin/describe
ENV PATH="/opt/bin:${PATH}"
...

拥有 Docker 映像的用户现在运行以下命令以将降价发送到标准输出

docker run myimage:version describe

此解决方案将特定版本的图像的文档捆绑在图像中,并且可以在没有任何外部依赖项的情况下检索它


推荐阅读