Podman 引入对 OCI 工件的支持

开放容器倡议 (以下简称 OCI) 工件最近有了显著的演变。诸如 OCI Registry As Storage (ORAS) 等项目一直是这一领域的坚定支持者。事实上,我认为 ORAS 可能对工件有最好的解释。如果你对这个话题完全不熟悉,它绝对值得一读。简而言之,工件是存储在 OCI 注册表上的文件,可以与容器化应用程序结合使用,从而在它们的打包和交付方面提供更大的灵活性。

Podman 和 Buildah 自 2024 年以来就能够通过其清单动词支持 OCI 工件。工件可以添加到清单中,并以与添加多架构容器镜像相同的方式推送到镜像注册表。这种方法要求用户比必要地更多地了解 OCI 内部结构,这可能导致工件的使用率降低。

因此,Podman 最近在添加工件方面的工作围绕以下思想展开:

  • 初始支持将是实验性的,并且仅限 Linux。
  • 工件是受管理的。
  • 通过对工件的假设简化流程,高级用例仍然可以使用清单命令。

Podman 中目前的支持被认为是实验性的,并且仅适用于 Linux 上的 Podman。初始解决方案不包括对远程功能或 RESTFUL API 的支持。我希望在此期间用户能提供反馈,以确认我们对工件的处理方法。如果您有反馈,请通过我们的上游 GH 存储库(作为问题或讨论)或通过其他社区互动(例如我们的会议或聊天)进行沟通。

在 Podman 中,我将工件实现为受管理对象。这意味着我们对它们有一些状态信息。它们位于系统上的特定存储(目录)中。该实现遵循 containers/imagecontainers/storage 中定义的方法,这是 Podman 处理容器镜像的核心。非特权用户的工件默认存储路径是 ~/.local/share/containers/storage/artifacts。Podman 管理的工件使用 OCI 清单标准,这与容器镜像非常相似。

工件必须“添加”到存储中才能被 Podman 识别,这可以从本地文件系统完成,也可以通过从容器注册表中拉取工件来完成。一旦进入存储,Podman 就可以检查、列出 (ls)、删除 (rm) 和推送工件。Podman 的初始实现不允许任何特殊的注释或工件类型的声明。

如前所述,我希望简化用户与工件的交互方式。为此,我们还必须对工件的使用方式(用例)做一些假设。在这种情况下,一些高级用例和工件的自定义将无法实现,但我们仍然可以使用 podman|buildah manifest 来完成此操作。

我们计划了几个与工件相关的路线图项目。其中最重要的是能够从工件创建卷。这里的目标是能够通过卷在运行时将工件添加到容器中。容器镜像将需要具有处理工件的逻辑,但到那时,工件基本上类似于绑定挂载。我们还将添加一个功能,用于从工件中提取文件到本地文件系统。

我们还需要在 RESTFUL API 中实现对工件的支持。一旦完成,我们就可以为 Podman 的远程客户端(包括 Mac 和 Windows)添加支持。最后,将支持添加到 containers/podman-py 也是合乎逻辑的。

如果您对 Podman 中专门用于工件的代码感兴趣,请查看我们上游 GitHub 存储库上的拉取请求

podman artifact 命令有许多选项。这些可以使用 podman artifact –help 命令显示。

$ podman artifact --help
Manage OCI artifacts

Description:
  Manage OCI artifacts

Usage:
  podman artifact [command]

Available Commands:
  add         Add an OCI artifact to the local store
  inspect     Inspect an OCI artifact
  ls          List OCI artifacts
  pull        Pull an OCI artifact
  push        Push an OCI artifact
  rm          Remove an OCI artifact

Podman 允许您从本地机器上的文件创建工件。这可以通过 podman artifact add 命令完成。此外,您需要完全限定名称和工件文件的路径。

$ podman artifact add quay.io/baude/artifact:1 /home/baude/myartifact1
c3c50e599906b242af0ab264ca9ef4346866cc31f57d2e7091fff6c3c9124aef

artifact add 命令返回工件清单的摘要。

一旦工件被添加到本地工件存储中,Podman 就会识别它。您可以使用 podman artifact ls 命令查看您的工件。此命令不需要额外的输入。请注意,artifact ls 命令还会显示工件的摘要和大小。

$ podman artifact ls
REPOSITORY              TAG         DIGEST        SIZE
quay.io/baude/artifact  1           c3c50e599906  20.97MB

一个工件也可以关联多个文件。这里添加了一个带有两个文件的工件。

$ podman artifact add quay.io/baude/artifact:2 /home/baude/myartifact2 /home/baude/myartifact3
4fb2a21ac95ba90ae028f0f2315d15a061f714e75498d4d2a97e000787f92532

现在存储中有两个工件。

$ podman artifact ls
REPOSITORY              TAG         DIGEST
quay.io/baude/artifact  1           c3c50e599906  20.97MB
quay.io/baude/artifact  2           4fb2a21ac95b  1.363GB

当工件在本地工件存储中时,可以像镜像、容器和机器一样对其进行检查。podman artifact inspect 命令显示有关工件的更详细信息,包括注释、媒体类型、字节大小等等。另请注意,inspect 显示工件中的原始文件名,由注释中的 *org.opencontainers.image.title* 字段表示。

$ podman artifact inspect quay.io/baude/artifact:2
{
     "Manifests": [
          {
               "schemaVersion": 2,
               "mediaType": "application/vnd.oci.image.manifest.v1+json",
               "config": {
                    "mediaType": "application/vnd.oci.empty.v1+json",
                    "digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
                    "size": 2,
                    "data": "e30="
               },
               "layers": [
                    {
                         "mediaType": "application/octet-stream",
                         "digest": "sha256:c4fa7b2c66f970a425feacb37e2397dc3e2a11b3bfd02886cc05b1d6a37b290f",
                         "size": 209715200,
                         "annotations": {
                              "org.opencontainers.image.title": "myartifact3"
                         }
                    },
                    {
                         "mediaType": "application/octet-stream",
                         "digest": "sha256:1fa946e45abbf77033a49e9804a093f2afab996cb411905f92397a4c27e6da9d",
                         "size": 1153433600,
                         "annotations": {
                              "org.opencontainers.image.title": "myartifact3"
                         }
                    }
               ]
          }
     ],
     "Name": "quay.io/baude/artifact:2",
     "Digest": "sha256:4fb2a21ac95ba90ae028f0f2315d15a061f714e75498d4d2a97e000787f92532"
}

当工件被共享时,它们会变得更有趣。最常见的方法是使用容器镜像注册表,例如 quay.io。您可以使用 podman artifact pull 命令从注册表中拉取工件,就像拉取镜像一样。在以下示例中,拉取了 quay.io 上名为 quay.io/baude/artifact:single 的现有工件。

注意:与镜像不同,工件不会使用所谓的“短名称”,这意味着您必须始终使用完全限定的工件名称。短名称是指用户只提供镜像名称的一部分,Podman 必须为该引用找出注册表。例如,当拉取 alpine 时,podman 必须将其转换为 docker.io/library/alpine:latest。

$ podman artifact pull quay.io/baude/artifact:single
Getting image source signatures
Copying blob 3ddc0a3cdb61 done   | 
Copying config 44136fa355 done   | 
Writing manifest to image destination

请注意,pull 的输出与使用 Podman 拉取容器镜像的输出非常相似。

artifact ls 命令显示新拉取的工件。

$ podman artifact ls
REPOSITORY              TAG         DIGEST                                                            SIZE
quay.io/baude/artifact  1           88c890e87ebf251e603adb79a334f251bf3c3351ecb83f8492f4d058d550f17a  5.243GB
quay.io/baude/artifact  2           f0d6534e77684c2f5f80de05a4a47a4bcea2335ec941d33836dbd3a39056eb30  623.9MB
quay.io/baude/artifact  single      281c5b9261eeb11af44008980631664be6d3b89fb62a83533b26e01ecd960db9  524.3MB

与容器镜像一样,工件也使用 podman artifact push 命令进行推送。这将获取您的本地工件并将其传输到您选择的容器镜像注册表(根据完全限定的工件引用)。在此示例中,使用多个文件创建的工件被推送到 quay.io。

$ podman artifact push quay.io/baude/artifact:2
quay.io/baude/artifact  1           c3c50e599906  20.97MB
quay.io/baude/artifact  2           4fb2a21ac95b  1.363GB
quay.io/baude/artifact  single      281c5b9261ee  524.3MB
Writing manifest to image destination

最后,本地存储中的工件可以使用 podman artifact rm 命令从本地存储中删除。

$ podman artifact rm quay.io/baude/artifact:1
c3c50e599906b242af0ab264ca9ef4346866cc31f57d2e7091fff6c3c9124aef

如果您对工件感兴趣,请继续关注,因为我们的支持应该会在未来几个月内在上游继续成熟。我的几位同事在帮助 Podman 塑造对工件的支持方面至关重要。因此,我感谢 Nalin Dahyabhai、Miloslav Trmac、Valentin Rothberg 和 Dan Walsh 在此功能开发过程中的贡献和支持。

发表评论

订阅

输入您的电子邮件地址以接收来自本网站的电子邮件更新。

返回

您的消息已发送

警告
警告
警告。

分类


搜索