跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 容器指南 / 创建自定义容器映像
适用范围 SUSE Linux Enterprise Server 15 SP4

8 创建自定义容器映像

要创建自定义映像,需要有 SUSE Linux Enterprise Server 的基本映像。您可以使用任何预构建的 SUSE Linux Enterprise Server 映像。

8.1 提取基本 SLES 映像

要获取 SUSE Linux Enterprise 12 SP3 和更高版本的预构建基本映像,请使用以下命令:

      > docker pull registry.suse.com/suse/
      IMAGENAME

例如,对于 SUSE Linux Enterprise Server 15,命令如下:

> docker pull registry.suse.com/suse/sle15

不需要使用 sle2docker,因为系统会从 Docker 注册表中提取该映像。

有关获取特定基本映像的信息,请参见第 7.1 节 “SUSE Linux Enterprise 基本映像”

容器映像准备就绪后,便可以按照第 8.2 节 “自定义 SLES 容器映像”中所述对其进行自定义。

8.2 自定义 SLES 容器映像

预构建的映像未配置任何软件源,也不包含任何模块或扩展。它们包含一个 zypper 服务,该服务根据运行容器的 SUSE Linux Enterprise Server 主机的配置联系 SUSE® Customer Center 或 Repository Mirroring Tool (RMT) 服务器。该服务会获取容器映像所用产品的可用软件源列表。您还可以直接在 Dockerfile 中声明扩展。有关详细信息,请参见第 8.2.3 节 “将 SLE 扩展和模块添加到映像中”

注意
注意:SLE_BCI 软件源

从 SUSE Linux Enterprise 15 SP3 开始,默认基本映像会包含 SLE_BCI 软件源。仅当某个容器是在未注册的 SLES 主机上构建的或是在此类主机上运行时,或者当容器无法使用注册身份凭证时,才使用此软件源。该软件源提供了一部分 SUSE Linux Enterprise 15 SP3 软件包,用于自定义 SLES 容器映像。无需注册即可使用该软件源,但 SUSE 不对其提供支持。

您不需要在容器映像中添加任何身份凭证,因为 docker 守护程序会自动将计算机身份凭证插入到容器中的 /run/secrets 目录。这同样适用于主机系统的 /etc/SUSEConnect 文件,该文件会自动插入到 /run/secrets 目录中。

注意
注意:身份凭证和安全性

/run/secrets 目录的内容永远不会包含在容器映像中,因此不存在身份凭证泄露的风险。

注意
注意:在已于 RMT 中注册的系统上构建映像

如果用于构建容器映像的主机系统已在 RMT 中注册,则默认行为只允许构建其代码库与主机相同的容器。例如,如果您的容器主机是 SLE 15 系统,则默认只能在该主机上构建基于 SLE 15 的映像。要为不同的 SLE 版本(例如,SLE 15 主机上的 SLE 12)构建映像,可将目标版本的主机计算机身份凭证插入到容器中(如下所述)。请注意,如果 RMT 服务器使用自我签名证书,则需要将匹配的 CA 证书添加到 CA 可信证书储存区/rmt-server.pem 中的容器才能接受证书。

如果主机系统已在 SUSE Customer Center 中注册,则此限制不适用。

注意
注意:在公有云中的按需 SLE 实例上构建容器映像

在公有云(AWS、GCE 或 Azure)中以按需或即用即付实例形式启动的 SLE 实例上构建容器映像需要执行额外的步骤。要安装软件包和更新,需将按需公有云实例连接到更新基础结构。此基础结构基于 SUSE 在不同公有云提供商处运营的 RMT 服务器工作。

因此,您的计算机需要找到所需的服务并向其进行身份验证。可以使用 containerbuild-regionsrv 服务来执行此操作。通过各公有云提供商的商城提供的公有云映像中提供此服务。在构建映像之前,必须通过运行以下命令在公有云实例上启动此服务:

> sudo systemctl start containerbuild-regionsrv

要让该服务在系统启动时自动启动,请启用该服务:

> sudo systemctl enable containerbuild-regionsrv

SLE 基本映像提供的 Zypper 插件将连接到此服务,并检索身份验证细节以及有关要与哪个更新服务器通讯的信息。为此,必须在启用主机网络的情况下构建容器,例如:

        > docker build --network host
        build-directory/

由于公有云中的更新基础结构基于 RMT 工作,因此,为不同于主机 SLE 版本的 SLE 版本构建 SLE 映像也存在同样的限制(参见注意:在已于 RMT 中注册的系统上构建映像)。

要获取软件源列表,请使用以下命令:

> sudo zypper ref -s

这会自动将所有软件源添加到容器中。对于添加到系统中的每个软件源,将在 /etc/zypp/repos.d 下创建一个新文件。这些软件源的 URL 包含一个在 12 小时后自动失效的访问令牌。要续订该令牌,请运行 zypper ref -s 命令。将这些文件包含在容器映像中不会带来任何安全风险。

要使用一组不同的身份凭证,请将自定义 /etc/zypp/credentials.d/SCCcredentials 文件放入容器映像中。该文件中的计算机身份凭证包含您要使用的订阅。这同样适用于 SUSEConnect 文件:要覆盖运行容器的主机系统上的现有文件,请将自定义 /etc/SUSEConnect 文件添加到容器映像中。

现在,您便可以按照第 8.2.1 节 “为 SLE 12 SP3 和更高版本创建自定义映像”中所述使用 Dockerfile 来创建自定义容器映像。

如果您要将应用程序移到容器中,请参见第 9 章 “创建应用程序映像

编辑 Dockerfile 后,通过在 Dockerfile 所在的同一目录中运行以下命令来构建映像:

> docker build .

有关 docker build 选项的详细信息,请参见官方 Docker 文档

注意
注意:创建应用程序映像

有关如何为在容器中运行的应用程序创建 Dockerfile 的信息,请参见第 9 章 “创建应用程序映像

8.2.1 为 SLE 12 SP3 和更高版本创建自定义映像

下面的 Dockerfile 会创建一个基于 SUSE Linux Enterprise Server 15 的简单容器映像:

        FROM registry.suse.com/suse/sle15

        RUN zypper ref -s
        RUN zypper -n in vim

如果 Docker 主机计算机已在内部 RMT 服务器中注册,则该映像需要 RMT 使用的 SSL 证书:

        FROM registry.suse.com/suse/sle15

        # Import the crt file of our private SMT server
        ADD http://smt.example.com/smt.crt /etc/pki/trust/anchors/smt.crt
        RUN update-ca-certificates

        RUN zypper ref -s
        RUN zypper -n in vim

8.2.2 SLE 容器映像中的元信息

从 SUSE Linux Enterprise 12 SP3 开始,所有基本容器映像都包含构建时戳和说明等信息。此信息以附加到基本映像的标签形式提供,因此可用于派生的映像和容器(参见第 7.2.2 节 “标签”)。可以使用 docker inspect 查看此信息:

        > docker inspect registry.suse.com/suse/sle15
        [...]
        "Labels": {
            "com.suse.sle.base.created": "2020-11-23T11:51:32.695975200Z",
            "com.suse.sle.base.description": "Image containing a minimal environment for containers based on SUSE Linux Enterprise Server 15 SP2.",
            "com.suse.sle.base.disturl": "obs://build.suse.de/SUSE:SLE-15-SP2:Update:CR/images/4a8871be8078bcef2e2417e2a98fc3a0-sles15-image",
            "com.suse.sle.base.reference": "registry.suse.com/suse/sle15:15.2.8.2.794",
            "com.suse.sle.base.title": "SUSE Linux Enterprise Server 15 SP2 Base Container",
            "com.suse.sle.base.url": "https://www.suse.com/products/server/",
            "com.suse.sle.base.vendor": "SUSE LLC",
            "com.suse.sle.base.version": "15.2.8.2.794",
            "org.openbuildservice.disturl": "obs://build.suse.de/SUSE:SLE-15-SP2:Update:CR/images/4a8871be8078bcef2e2417e2a98fc3a0-sles15-image",
            "org.opencontainers.image.created": "2020-11-23T11:51:32.695975200Z",
            "org.opencontainers.image.description": "Image containing a minimal environment for containers based on SUSE Linux Enterprise Server 15 SP2.",
            "org.opencontainers.image.title": "SUSE Linux Enterprise Server 15 SP2 Base Container",
            "org.opencontainers.image.url": "https://www.suse.com/products/server/",
            "org.opencontainers.image.vendor": "SUSE LLC",
            "org.opencontainers.image.version": "15.2.8.2.794",
            "org.opensuse.reference": "registry.suse.com/suse/sle15:15.2.8.2.794"
        },
        [...]

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

8.2.3 将 SLE 扩展和模块添加到映像中

如果您订阅了要在自定义映像中使用的 SUSE Linux Enterprise Server 扩展或模块,可以通过指定 ADDITIONAL_MODULES 环境变量将它们添加到容器映像中:

ENV ADDITIONAL_MODULES sle-module-desktop-applications,sle-module-development-tools