第 18 章 在容器中运行 Skopeo、Buildah 和 Podman

您可以在容器中运行 Skopeo、Buildah 和 Podman。

使用 Skopeo,您可以检查远程注册中心中的镜像,而无需下载整个镜像及其所有层。您还可以使用 Skopeo 来复制镜像、签名镜像、同步镜像以及在不同格式和层压缩间转换镜像。

Buildah 处理对 OCI 容器镜像的构建。使用 Buildah,您可以创建一个可运行的容器,可以从头开始,也可以使用一个镜像作为起点。您可以从正常工作的容器或使用 Containerfile 中的指令来创建镜像。您可以挂载和卸载正常工作容器的根文件系统。

借助 Podman,您可以管理容器和镜像、挂载到这些容器的卷,以及容器组构成的 pod。Podman 是基于容器生命周期管理的 libpod 库。libpod 库提供用于管理容器、Pod、容器镜像和卷的 API。

在容器中运行 Buildah、Skopeo 和 Podman 的原因:

  • CI/CD 系统

    • Podman 和 Skopeo :您可以在 Kubernetes 中运行 CI/CD 系统,或者使用 OpenShift 来构建容器镜像,并在不同的容器 registry 之间分发这些镜像。要将 Skopeo 集成到 Kubernetes 工作流中,您需要在容器中运行它。
    • Buildah :您希望在 Kubernetes 或 OpenShift CI/CD 系统中构建持续构建镜像的 OCI/container 镜像。在以前的版本中,人们使用 Docker 套接字连接到容器引擎,并执行 docker build 命令。这等同于为系统提供 root 访问权限而无需一个不安全的密码。因此,Red Hatrecommends 在容器中使用 Buildah。
  • 不同的版本

    • All:您在主机上运行旧的操作系统,但您想要运行最新版本的 Skopeo、Buildah 或 Podman。解决方法是在容器中运行容器工具。例如,这可用于在 Red Hat Enterprise Linux 7 容器主机上运行 Red Hat Enterprise Linux 8 中提供的容器工具的最新版本,而无需原生访问最新版本。
  • HPC 环境

    • All:HPC 环境中的一个常见的限制是不允许非 root 用户在主机上安装软件包。当您在容器中运行 Skopeo、Buildah 或 Podman 时,您可以以非 root 用户身份执行这些特定的任务。

18.1. 在容器中运行 Skopeo

您可以使用 Skopeo 检查远程容器镜像。在容器中运行 Skopeo 意味着容器根文件系统与主机 root 文件系统分离。要在主机和容器间共享或复制文件,您必须挂载文件和目录。

先决条件

  • container-tools 元数据包已安装。

流程

  1. 登录到 registry.redhat.io 注册中心:

    $ podman login registry.redhat.io
    Username: myuser@mycompany.com
    Password: <password>
    Login Succeeded!
  2. 获取 registry.redhat.io/rhel9/skopeo 容器镜像:

    $ podman pull registry.redhat.io/rhel9/skopeo
  3. 使用 Skopeo 检查远程容器镜像 registry.access.redhat.com/ubi9/ubi:

    $ podman run --rm registry.redhat.io/rhel9/skopeo \
      skopeo inspect docker://registry.access.redhat.com/ubi9/ubi
    {
        "Name": "registry.access.redhat.com/ubi9/ubi",
        ...
        "Labels": {
            "architecture": "x86_64",
            ...
            "name": "ubi9",
            ...
            "summary": "Provides the latest release of Red Hat Universal Base Image 9.",
            "url": "https://access.redhat.com/containers/#/registry.access.redhat.com/ubi9/images/8.2-347",
            ...
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Layers": [
        ...
        ],
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "container=oci"
        ]
    }

    --rm 选项会在容器退出后删除 registry.redhat.io/rhel9/skopeo 镜像。