跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 容器指南 / SLE 基本容器映像
适用范围 容器指南

4 SLE 基本容器映像

4.1 SLE 基本容器映像简介

SLE 基本容器映像 (SLE BCI) 是基于 SLES 15 的精简映像,可用于开发、部署和共享应用程序。SLE BCI 有两种类型:

  • 通用 SLE BCI 可用于构建自定义容器映像和部署应用程序。

  • 语言堆栈 SLE BCI 为以特定编程语言开发应用程序和部署这些应用程序提供精简的环境。

https://registry.suse.com 上提供了 SLE 基本容器映像。其中包含已经过测试和更新的 SLE 基本容器映像。SUSE 注册表中的所有映像都要经历一个维护过程。构建的映像包含最新可用的更新和修复。SUSE 注册表的 Web 用户界面列出了一部分可用映像。有关 SUSE 注册表的信息,请参见第 3.1 节 “SUSE 注册表”

SUSE 注册表中的 SLE 基本映像会收到安全更新,并涵盖在 SUSE 支持计划中。有关这些支持计划的详细信息,请参见第 15 章 “兼容性和支持条件

4.2 为何使用选择 SLE 基本容器映像

SLE BCI 提供一个平台用于创建基于 SLES 的自定义容器映像和可任意分发的容器化应用程序。SLE BCI 具有与 SLES 相同的可预测企业生命周期。SLE_BCI 15 SP3 和 SP4 储存库(SLE 储存库的子集)使 SLE BCI 能够访问 4000 个适用于 AMD64/Intel 64、AArch64、PowerPC 和 IBM Z 体系结构的软件包。储存库中的软件包享有 SUSE 的质量保证并接受其安全审计。以 FIPS 模式在主机上运行时,容器映像符合 FIPS 规范。除此之外,SUSE 还可以通过 SUSE 订阅计划为 SLE BCI 提供官方支持。

安全性

SLE_BCI 储存库中的每个软件包都接受安全审计,SLE BCI 受益于与 SUSE Linux Enterprise Server 相同的 CVE 处理机制。所有发现和修复的漏洞将通过电子邮件、专门的 CVE 页面以 OVAL 和 CVRF 数据的形式公布。为确保供应链的安全,所有容器映像均已使用 Notary v1、Podman 的 GPG 签名和 Sigstore Cosign 进行签名。

可靠性

由于 SLE BCI 基于 SLES,因此它们具有相同级别的稳定性和质量保证。类似于 SLES,SLE BCI 可以通过维护更新来获得 bug 修复、改进和安全补丁。

工具和集成

SLE BCI 旨在为 hub.docker.com 上的流行容器映像提供直接替代项。您可以使用通用 SLE BCI 及其提供的现成工具来创建自定义容器映像,而语言堆栈 SLE BCI 为构建容器化应用程序提供基础和所需的工具。

重新分发

SLE 基本容器映像的 EULA 条款较为宽松,您可以再分发基于 SLE 基本容器映像的自定义容器映像。

4.2.1 高亮显示数

  • SLE BCI 与 SLES 完全兼容,但无需订阅即可运行和分发

  • 当主机操作系统以 FIPS 模式运行时,SLE BCI 会自动以 FIPS 兼容模式运行。

  • 每个 SLE BCI 都包含 RPM 数据库,因此可以审计容器映像的内容。您可以使用 RPM 数据库来确定任意给定文件所属的 RPM 软件包的特定版本。这可以确保容器映像不容易受到已知漏洞和已修复漏洞的影响。

  • 所有 SLE BCI(不包含 Zypper 的 SLE BCI 除外)都附带 container-suseconnect 服务。因此,在已注册的 SLES 主机上运行的容器可以访问完整的 SLES 储存库。当您首次运行 Zypper 时会自动调用 container-suseconnect,该服务会将正确的 SLES 储存库添加到正在运行的容器中。在未注册的 SLES 主机或非 SLES 主机上,该服务不执行任何操作。有关更多信息,请参见第 5.2 节 “container-suseconnect”

注意
注意:SLE_BCI 储存库

每个 SLE 服务包都有一个 SLE_BCI 储存库。这意味着,基于 SP4 的 SLE BCI 可以访问 SP4 的 SLE_BCI 储存库,所有基于 SP5 的 SLE BCI 可以使用 SP5 的 SLE_BCI 储存库,依此类推。每个 SLE_BCI 储存库包含除内核、引导加载程序、安装程序(包括 YaST)、桌面环境和超级管理程序(例如 KVM 和 Xen)之外的其他所有 SLE 软件包。

注意
注意:请求缺失的软件包

如果 SLE_BCI 储存库不包含您所需的软件包,您可以采取两种做法。现有的 SUSE 客户可以提交功能请求。普通用户可以通过在 Bugzilla 中创建问题来请求创建软件包。

4.3 通用 SLE BCI

有四个通用 SLE BCI,其中每个容器映像附带最少量的一组软件包,以保持较小的大小。可将通用 SLE BCI 用作构建自定义容器映像的起点,或用作部署特定软件的平台。

SUSE 提供多个通用 SLE BCI,这些 BCI 可用作部署目标或用作创建自定义映像的基础:BCI-Base、BCI-Minimal、BCI-Micro 和 BCI-BusyBox。这些映像采用通用的 SLES 基础,并且它们都不随附特定的语言或应用程序堆栈。所有映像具有 RPM 数据库(即使特定的映像不包含 RPM 软件包管理器),该数据库可用于校验映像中每个文件的来源。每个映像包含 SLES 证书分发包,已部署的应用程序可以通过该分发包使用系统的证书来校验 TLS 连接。

下表简要概述了 SLE BCI-Base、SLE BCI-Minimal、SLE BCI-Micro 和 SLE BCI-BusyBox 之间的差异。

表 4.1︰ 支持矩阵
功能SLE BCI-BaseSLE BCI-MinimalSLE BCI-MicroSLE BCI-BusyBox

glibc

CA 证书

rpm 数据库

coreutils

busybox

bash

rpm(二进制文件)

zypper

4.3.1 SLE BCI-Base 和 SLE BCI-Init:需要灵活性时

此 SLE BCI 附带 Zypper 软件包管理器和免费的 SLE_BCI 储存库。这样,您便可以安装储存库中提供的软件并在构建期间自定义映像。该映像的缺点在于其大小。它是最大的通用 SLE BCI,因此它不一定是最佳的部署映像选项。

名为 SLE BCI-Init 的 SLE BCI-Base 变体中预安装了 systemd。在需要通过 systemd 在单个容器中管理服务的方案中,SLE BCI-Init 容器映像可能很有用。

重要
重要:将 SLE BCI-init 与 Docker 配合使用

将 SLE BCI-init 容器与 Docker 配合使用时,必须使用以下参数才能使 SYSTEMD 在容器中正常工作:

> docker run -ti --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:rw --cgroupns=host registry.suse.com/bci/bci-init:latest

要正确关闭容器,请使用以下命令:

> docker kill -s SIGRTMIN+3 CONTAINER_ID

4.3.2 SLE BCI-Minimal:不需要 Zypper 时

这是 SLE BCI-Base 映像的精简版本。SLE BCI-Minimal 不包含 Zypper,不过其中安装了 RPM 软件包管理器。这样就大幅减小了该映像的大小。但是,虽然 RPM 可以安装和去除软件包,但它缺乏对储存库和自动依赖项解析的支持。因此,SLE BCI-Minimal 映像旨在用于创建部署容器,然后在容器中安装所需的 RPM 软件包。尽管您可以安装所需的依赖项,但需要手动下载和解析这些依赖项。不过,不建议采用这种方法,因为它很容易出错。

4.3.3 SLE BCI-Micro:需要部署静态二进制文件时

此映像类似于 SLE BCI-Minimal,但不包含 RPM 软件包管理器。该映像的主要用例是部署在外部生成的或者在多阶段构建期间生成的静态二进制文件。由于没有直截了当的方法可以在容器映像中安装其他依赖项,因此我们建议仅在最终构建工件捆绑了所有依赖项并且不存在外部运行时要求(例如 Python 或 Ruby)时,才使用 SLE BCI-Minimal 映像来部署项目。

4.3.4 SLE BCI-BusyBox:需要最小的映像且无需 GPLv3 授权时

类似于 SLE BCI-Micro,SLE BCI-BusyBox 映像仅附带最基本的工具。但是,这些工具是由 BusyBox 项目提供的。其好处是可以进一步减小大小。此外,该映像不包含 GPLv3 授权的软件。使用该映像时,请记住 BusyBox 工具和 GNU Coreutils 之间存在一些差异。因此,针对使用 GNU Coreutils 的系统编写的脚本可能需要经过修改才可用于 BusyBox。

4.3.5 大致大小

以下列表提供了每个 SLE BCI 的大致大小供您参考。请记住,提供的数字是粗略估计值。

  • SLE BCI-Base ~94 MB

  • SLE BCI-Minimal ~42 MB

  • SLE BCI-Micro ~26 MB

  • SLE BCI-BusyBox ~14 MB

4.4 语言堆栈 SLE BCI

语言堆栈 SLE BCI 构建在 BCI-Base 通用 SLE BCI 的基础之上。每个容器映像附带 SLE_BCI 堆栈和免费的 SLE_BCI 储存库。此外,每个映像包含用于在特定语言环境中构建和部署应用程序的最常用工具。这包括编译器或解释器等工具,以及特定于语言的软件包管理器。

下面是可用语言堆栈 SLE BCI 的概览。

python
node
openjdk
openjdk-devel
ruby
rust
golang
dotnet-runtime
dotnet-aspnet
dotnet-sdk

4.5 应用程序 SLE BCI

应用程序 SLE BCI 是基于 SLE BCI 的容器映像,其中包含特定的应用程序,例如 PostgreSQL 数据库和 Performance Co-Pilot(系统级性能分析工具包)。应用程序 SLE BCI 在 SUSE 注册表的专门部分中提供。

4.6 有关状态和生命周期的重要说明

除基本映像以外的其他所有容器映像目前都分类为技术预览,SUSE 不为它们提供官方支持。此信息会在 registry.suse.com 网站上显示。此外,还会通过 com.suse.supportlevel 标签来指示某个容器映像是否仍处于技术预览状态。可以使用 skopeo 和 jq 实用程序检查所需 SLE BCI 的状态,如下所示:

> skopeo inspect docker://registry.suse.com/bci/bci-micro:15.4 | jq '.Labels["com.suse.supportlevel"]'
"techpreview"

> skopeo inspect docker://registry.suse.com/bci/bci-base:15.4 | jq '.Labels["com.suse.supportlevel"]'
"l3"

在上面的示例中,bci-micro 容器映像中的 com.suse.supportlevel 标签设置为 techpreview,表示该映像仍处于技术预览状态。相比之下,bci-base 容器映像则享受完全的 L3 支持。与通用 SLE BCI 不同,语言堆栈 SLE BCI 可能不遵循 SLES 分发包的生命周期:只要相应的语言堆栈能够获得支持,语言堆栈 SLE BCI 就受支持。换言之,新版本的 SLE BCI(由 OCI 标记表示)可能会在 SLES Service Pack 的生命周期内发布,而旧版本可能不受支持。请访问 suse.com/lifecycle 确定相关容器是否仍受支持。

重要
重要

SLE 基本容器映像在其支持周期结束后将不再更新。如果发生这种情况,您不会收到任何通知。

4.6.1 SLE BCI 标签

SLE BCI 具有以下标签。

com.suse.image-type

显示这是一个纯 SLE BCI,还是基于另一个 SLE BCI 的应用程序容器。

com.suse.eula

标示 SUSE EULA 的哪一部分适用于容器映像。

com.suse.release-stage

指示映像的当前发布阶段。

  • prototype 指示容器映像处于 ALP 原型阶段。

  • alpha 防止容器映像显示在 registry.suse.com Web 界面中,即使该映像在该界面中可用。该值还指示容器映像的 Alpha 质量。

  • beta 在 registry.suse.com Web 界面的“Beta 容器映像”部分列出容器映像,并为该映像添加 Beta 标签。该值还指示容器映像的 Beta 质量。

  • released 指示容器映像已发布并适合用于生产。

com.suse.supportlevel

显示容器的支持级别。

  • l2 问题隔离,该技术支持级别旨在分析数据、重现客户问题、隔离问题区域,并针对级别 1 不能解决的问题提供解决方法,或作为级别 3 的准备级别。

  • l3 问题解决,该技术支持级别旨在借助工程方法解决级别 2 支持所确定的产品缺陷。

  • acc 与 SLE 基本容器映像一起交付的软件可能需要签署外部合同。

  • techpreview 该映像不受支持,旨在用于概念证明方案。

  • unsupported 不为映像提供支持。

com.suse.lifecycle-url

指向提供映像生命周期信息的 https://www.suse.com/lifecycle/ 页面。

4.6.1.1 使用 SLE BCI 标签

从 SLE 15 SP3 开始,所有基本容器映像都包含构建时戳和说明等信息。此信息以附加到基本映像的标签形式提供,因此可用于派生的映像和容器。

下面是 podman inspect 显示的标签信息的示例:

podman inspect registry.suse.com/suse/sle15
[...]
"Labels": {
            "com.suse.bci.base.created": "2023-01-26T22:15:08.381030307Z",
            "com.suse.bci.base.description": "Image for containers based on SUSE Linux Enterprise Server 15 SP4.",
            "com.suse.bci.base.disturl": "obs://build.suse.de/SUSE:SLE-15-SP4:Update:CR/images/1477b070ae019f95b0f2c3c0dce13daf-sles15-image",
            "com.suse.bci.base.eula": "sle-bci",
            "com.suse.bci.base.image-type": "sle-bci",
            "com.suse.bci.base.lifecycle-url": "https://www.suse.com/lifecycle",
            "com.suse.bci.base.reference": "registry.suse.com/suse/sle15:15.4.27.14.31",
            "com.suse.bci.base.release-stage": "released",
            "com.suse.bci.base.source": "https://sources.suse.com/SUSE:SLE-15-SP4:Update:CR/sles15-image/1477b070ae019f95b0f2c3c0dce13daf/",
            "com.suse.bci.base.supportlevel": "l3",
            "com.suse.bci.base.title": "SLE BCI 15 SP4 Base Container Image",
            "com.suse.bci.base.url": "https://www.suse.com/products/server/",
            "com.suse.bci.base.vendor": "SUSE LLC",
            "com.suse.bci.base.version": "15.4.27.14.31",
            "com.suse.eula": "sle-bci",
            "com.suse.image-type": "sle-bci",
            "com.suse.lifecycle-url": "https://www.suse.com/lifecycle",
            "com.suse.release-stage": "released",
            "com.suse.sle.base.created": "2023-01-26T22:15:08.381030307Z",
            "com.suse.sle.base.description": "Image for containers based on SUSE Linux Enterprise Server 15 SP4.",
            "com.suse.sle.base.disturl": "obs://build.suse.de/SUSE:SLE-15-SP4:Update:CR/images/1477b070ae019f95b0f2c3c0dce13daf-sles15-image",
            "com.suse.sle.base.eula": "sle-bci",
            "com.suse.sle.base.image-type": "sle-bci",
            "com.suse.sle.base.lifecycle-url": "https://www.suse.com/lifecycle",
            "com.suse.sle.base.reference": "registry.suse.com/suse/sle15:15.4.27.14.31",
            "com.suse.sle.base.release-stage": "released",
            "com.suse.sle.base.source": "https://sources.suse.com/SUSE:SLE-15-SP4:Update:CR/sles15-image/1477b070ae019f95b0f2c3c0dce13daf/",
            "com.suse.sle.base.supportlevel": "l3",
            "com.suse.sle.base.title": "SLE BCI 15 SP4 Base Container Image",
            "com.suse.sle.base.url": "https://www.suse.com/products/server/",
            "com.suse.sle.base.vendor": "SUSE LLC",
            "com.suse.sle.base.version": "15.4.27.14.31",
            "com.suse.supportlevel": "l3",
            "org.openbuildservice.disturl": "obs://build.suse.de/SUSE:SLE-15-SP4:Update:CR/images/1477b070ae019f95b0f2c3c0dce13daf-sles15-image",
            "org.opencontainers.image.created": "2023-01-26T22:15:08.381030307Z",
            "org.opencontainers.image.description": "Image for containers based on SUSE Linux Enterprise Server 15 SP4.",
            "org.opencontainers.image.source": "https://sources.suse.com/SUSE:SLE-15-SP4:Update:CR/sles15-image/1477b070ae019f95b0f2c3c0dce13daf/",
            "org.opencontainers.image.title": "SLE BCI 15 SP4 Base Container Image",
            "org.opencontainers.image.url": "https://www.suse.com/products/server/",
            "org.opencontainers.image.vendor": "SUSE LLC",
            "org.opencontainers.image.version": "15.4.27.14.31",
            "org.opensuse.reference": "registry.suse.com/suse/sle15:15.4.27.14.31"
        },
[...]

所有标签将显示两次,以确保派生映像中有关原始基本映像的信息仍然可见且不会被覆盖。

可以使用 Podman 和 jq 工具 (sudo zypper in jq) 来检索本地映像的标签。以下命令列出所有标签,但仅列出 bci-base:15.4 映像的标签信息:

podman inspect registry.suse.com/bci/bci-base:15.4 | \
jq '.[0].Labels'

还可以检索特定标签的值:

podman inspect registry.suse.com/bci/bci-base:15.4 | \
jq '.[0].Labels["com.suse.sle.base.supportlevel"]'

上面的命令检索 com.suse.sle.base.supportlevel 标签的值。

使用 skopeo 工具可以检查映像的标签,而无需首先提取该映像。例如:

skopeo inspect docker://registry.suse.com/bci/bci-base:15.4 | \
jq '.Labels'
skopeo inspect docker://registry.suse.com/bci/bci-base:15.4 | \
jq '.Labels["com.suse.sle.base.supportlevel"]'

4.6.2 标记

标记用于引用映像。标记是映像名称的组成部分。与标签不同,标记可以自由定义,通常用于表示版本号。

如果某个标记存在于多个映像中,则将使用最新的映像。由映像维护者决定指派给容器映像的标记。

常规的标记格式为 repository name: image version specification(后者通常是版本号)。例如,最新发布的 PRODUCTNAME 15 SP2 映像的标记为 suse/sle15:15.2

4.7 使用 Cosign 校验 SLE BCI

要校验 SLE BCI,请在容器中运行 Cosign。以下命令从 SUSE 服务器提取签名密钥,并使用它来校验最新的 BCI 基本容器映像。

> podman run --rm -it gcr.io/projectsigstore/cosign verify \
    --key https://ftp.suse.com/pub/projects/security/keys/container–key.pem \
    registry.suse.com/bci/bci-base:latest | tail -1 | jq

[
  {
    "critical": {
      "identity": {
        "docker-reference": "registry.suse.com/bci/bci-base"
      },
      "image": {
        "docker-manifest-digest": "sha256:52a828600279746ef669cf02a599660cd53faf4b2430a6b211d593c3add047f5"
      },
      "type": "cosign container image signature"
    },
    "optional": {
      "creator": "OBS"
    }
  }
]

签名密钥可用于校验所有 SLE BCI,SLE 15 也附带了签名密钥(/usr/share/container-keys/suse-container-key.pem 文件)。

您还可以对照不可变防篡改帐本 rekor 检查 BCI 容器映像。例如:

> podman run --rm -it -e COSIGN_EXPERIMENTAL=1 gcr.io/projectsigstore/cosign \
    verify --key https://ftp.suse.com/pub/projects/security/keys/container–key.pem \
    registry.suse.com/bci/bci-base:latest | tail -1 | jq
[
  {
    "critical": {
      "identity": {
        "docker-reference": "registry.suse.com/bci/bci-base"
      },
      "image": {
        "docker-manifest-digest": "sha256:52a828600279746ef669cf02a599660cd53faf4b2430a6b211d593c3add047f5"
      },
      "type": "cosign container image signature"
    },
    "optional": {
      "creator": "OBS"
    }
  }
]

如果校验失败,则 cosign verify 命令的输出如下所示。

Error: no matching signatures:
crypto/rsa: verification error
main.go:62: error during command execution: no matching signatures:
crypto/rsa: verification error

4.8 了解 SLE BCI

如果您在容器方面有一定的实践知识,那么使用 SLE BCI 就不会有任何难度。但是,SLE BCI 有一些与类似产品(例如基于 Debian 或 Alpine Linux 的映像)不同的特性。了解细节有助于在尽可能短的时间内发挥 SLE BCI 的最大作用。

4.8.1 软件包管理器

SLES 中的默认软件包管理器是 Zypper。与 Debian 中的 APT 和 Alpine Linux 中的 APK 类似,Zypper 为所有软件包管理任务提供一个命令行界面。下面是常用的容器相关 Zypper 命令的简要概览。

安装软件包

zypper --non-interactive install PACKAGE_NAME

添加储存库

zypper --non-interactive addrepo REPOSITORY_URL; zypper --non-interactive refresh

更新所有软件包

zypper --non-interactive update

去除软件包

zypper --non-interactive remove --clean-deps PACKAGE_NAME--clean-deps 标志确保同时删除不再需要的依赖项)

清理临时文件

zypper clean

有关使用 Zypper 的详细信息,请参见 https://documentation.suse.com/sles/html/SLES-all/cha-sw-cl.html#sec-zypper

所述的所有命令都使用 --non-interactive 标志来跳过确认,因为在容器构建期间您无法手动同意这些提示。请记住,必须将该标志与任何修改系统的命令一起使用。另请注意,--non-interactive 不是一个“全部为是”标志。--non-interactive 确认用户的意图。例如,如果某个附带 --non-interactive 选项的安装命令需要导入新的储存库签名密钥,则该命令将会失败,因为该操作必须由用户自己来校验。

4.8.2 将 container-suseconnect 与 SLE BCI 配合使用

container-suseconnect 是 Zypper 随附的所有 SLE BCI 中的一个可用插件。当该插件检测到主机的 SUSE Linux Enterprise Server 注册身份凭证时,它会使用这些身份凭证来向容器授予对 SUSE Linux Enterprise 储存库的访问权限。这包括不属于免费 SLE_BCI 储存库的其他模块和以前的软件包版本。有关如何使用 SLES、openSUSE 和非 SLES 主机的储存库的详细信息,请参见第 5.2 节 “container-suseconnect”

4.8.3 常用软件集

下面几个示例可让您大致了解如何在 SLE BCI 中以不同于 Debian 的方式完成某些任务。

去除孤立的软件包
  • Debian:apt-get autoremove -y

  • SLE BCI:如果您使用 zypper --non-interactive remove --clean-deps PACKAGE_NAME 去除已安装的软件包,则不需要此项

获取容器的体系结构
  • Debian:dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"

  • SLE BCI:arch="$(uname -p|sed 's/x86_64/amd64/')"

安装编译所需的软件包
  • Debian:apt-get install -y build-essential

  • SLE BCI:zypper -n in gcc gcc-c++ make

校验 GnuPG 签名
  • Debian:gpg --batch --verify SIGNATURE_URL FILE_TO_VERIFY

  • SLE BCI:zypper -n in dirmngr; gpg --batch --verify SIGNATURE_URL FILE_TO_VERIFY; zypper -n remove --clean-deps dirmngr; zypper -n clean

4.8.4 软件包命名约定

SLE 软件包命名约定与 Debian、Ubuntu 和 Alpine 不同,与 RHEL 的命名约定较为接近。主要差别在于库的开发软件包(即包含报头和构建描述文件的软件包)在 SLE 中命名为 PACKAGE-devel,而在 Debian 和 Ubuntu 中则是命名为 PACKAGE-dev。如有疑问,请直接使用以下命令搜索软件包:docker run --rm registry.suse.com/bci/bci-base:OS_VERSION zypper search PACKAGE_NAME(请将 OS_VERSION 替换为相应的服务版本号,例如:15.315.4)。

4.8.5 添加 GPG 签名密钥

将外部储存库添加到容器或容器映像通常需要导入用于对软件包进行签名的 GPG 密钥。这可以使用 rpm --import KEY_URL 命令来完成。这会将密钥添加到 RPM 数据库,然后可以安装储存库中的所有软件包。

4.9 SLE 基本容器映像入门

可以直接从 registry.suse.com 以 OCI 兼容容器映像的形式获取 SLE BCI,并可以像使用任何其他容器映像一样使用它们。例如,使用某个通用容器:

> podman run --rm -it registry.suse.com/bci/bci-base:15.4 grep '^NAME' /etc/os-release
NAME="{sles}"

或者,可以如下所示在 Dockerfile 中使用 SLE BCI:

FROM registry.suse.com/bci/bci-base:15.4
RUN zypper -n in python3 && \
    echo "Hello Green World!" > index.html
ENTRYPOINT ["/usr/bin/python3", "-m", "http.server"]
EXPOSE 8000

然后可以使用 docker build .buildah bud . 命令构建容器映像:

> docker build .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM registry.suse.com/bci/bci-base:15.4
 ---> e34487b4c4e1
Step 2/4 : RUN zypper -n in python3 &&     echo "Hello Green World!" > index.html
 ---> Using cache
 ---> 9b527dfa45e8
Step 3/4 : ENTRYPOINT ["/usr/bin/python3", "-m", "http.server"]
 ---> Using cache
 ---> 953080e91e1e
Step 4/4 : EXPOSE 8000
 ---> Using cache
 ---> 48b33ec590a6
Successfully built 48b33ec590a6

> docker run -p 8000:8000 --rm -d 48b33ec590a6
575ad7edf43e11c2c9474055f7f6b7a221078739fc8ce5765b0e34a0c899b46a

> curl localhost:8000
Hello Green World!