11 创建自定义容器映像 #
要创建自定义映像,需要有 SUSE Linux Enterprise Server 的基本映像。您可以使用任何预构建的 SUSE Linux Enterprise Server 映像。
11.1 提取基本 SLES 映像 #
要获取 SLE 12 SP5 和更高版本的预构建基本映像,请使用以下命令:
> podman pull registry.suse.com/suse/IMAGENAME
例如,对于 SUSE Linux Enterprise Server 15,命令如下:
> podman pull registry.suse.com/suse/sle15
有关获取特定基本映像的信息,请参见第 4.1 节 “SLE 基本容器映像简介”。
容器映像准备就绪后,您可以按照第 11.2 节 “自定义 SLES 容器映像”中所述对其进行自定义。
11.2 自定义 SLES 容器映像 #
11.2.1 储存库和注册 #
预构建的映像未配置任何储存库,也不包含任何模块或扩展。它们包含一个 zypper 服务,该服务根据运行容器的 SUSE Linux Enterprise Server 主机的配置联系 SUSE Customer Center 或 Repository Mirroring Tool (RMT) 服务器。该服务会获取容器映像所用产品的可用储存库列表。您还可以直接在 Dockerfile
中声明扩展。有关详细信息,请参见第 5.2 节 “container-suseconnect”。
从 SLE 15 SP3 开始,默认基本映像包含 SLE_BCI
储存库。仅当某个容器是在未注册的 SLES 主机上构建的或是在此类主机上运行时,或者当容器无法使用注册身份凭证时,才使用此储存库。该储存库提供一部分可用于自定义 SLES 容器映像的 SLE 软件包。无需注册即可使用该储存库,但 SUSE 不对其提供支持。
您不需要在容器映像中添加任何身份凭证,因为 docker 守护程序会自动将计算机身份凭证插入到容器中的 /run/secrets
目录。这同样适用于主机系统的 /etc/SUSEConnect
文件,该文件会自动插入到 /run/secrets
目录中。
/run/secrets
目录的内容永远不会包含在容器映像中,因此不存在身份凭证泄露的风险。
如果用于构建容器映像的主机系统已在 RMT 中注册,则默认行为只允许构建其代码库与主机相同的容器。例如,如果您的容器主机是 SLE 15 系统,则默认只能在该主机上构建基于 SLE 15 的映像。要为不同的 SLE 版本(例如,SLE 15 主机上的 SLE 12)构建映像,可将目标版本的主机计算机身份凭证插入到容器中,如下所述。
请注意,如果 RMT 服务器使用自我签名证书,则需要将匹配的 CA 证书添加到 CA_TRUSTSTORE/rmt-server.pem
中的容器才能接受证书。
如果主机系统已在 SUSE Customer Center 中注册,则此限制不适用。
要获取储存库列表,请使用以下命令:
> sudo zypper repos
这会自动将所有储存库添加到容器中。对于添加到系统的每个储存库,都会在 /etc/zypp/repos.d
下创建一个新文件。这些储存库的 URL 包含一个在 12 小时后自动失效的访问令牌。要续订令牌,请运行命令 zypper ref -s
。将这些文件包含在容器映像中不会带来任何安全风险。
要使用一组不同的身份凭证,请将自定义 /etc/zypp/credentials.d/SCCcredentials
文件放入容器映像中。该文件中的计算机身份凭证包含您要使用的订阅。这同样适用于 SUSEConnect
文件:要覆盖运行容器的主机系统上的现有文件,请将自定义 /etc/SUSEConnect
文件添加到容器映像中。
现在,您便可以按照第 11.2.2 节 “为 SLE 12 SP5 和更高版本创建自定义映像”中所述使用 Dockerfile
来创建自定义容器映像。
编辑 Dockerfile
后,通过在 Dockerfile
所在的同一目录中运行以下命令来构建映像:
> podman build .
有关 podman build
选项的详细信息,请参见官方 Podman 文档。
11.2.2 为 SLE 12 SP5 和更高版本创建自定义映像 #
下面的 Dockerfile
会创建一个基于 SUSE Linux Enterprise Server 15 的简单容器映像:
FROM registry.suse.com/suse/sle15 RUN zypper ref -s && zypper -n in vim && zypper -n clean
如果 Podman 主机计算机已在内部 RMT 服务器中注册,则该映像需要 RMT 使用的 SSL 证书:
FROM registry.suse.com/suse/sle15 # Import the crt file of our private SMT server ADD http://smt./smt.crt /etc/pki/trust/anchors/smt.crt RUN update-ca-certificates && \ zypper ref -s && \ zypper -n in vim && \ zypper -n clean
如果您要将 SLE 扩展和模块添加到映像,请参见:第 5.2.4 节 “将模块添加到容器或容器映像”
11.2.3 在公有云中的按需 SLE 实例上构建容器映像 #
在公有云(AWS、GCE 或 Azure)中以按需或即用即付实例形式启动的 SLE 实例上构建容器映像需要执行额外的步骤。要安装软件包和更新,需将按需公有云实例连接到更新基础架构。此基础架构基于 SUSE 在公有云提供商处运营的 RMT 服务器工作。
因此,您的计算机需要找到所需的服务并向其进行身份验证。这可以使用 containerbuild-regionsrv
服务来完成。通过公有云提供商的商城提供的公有云映像中提供此服务。在构建映像之前,必须通过运行以下命令在公有云实例上启动此服务:
> sudo systemctl start containerbuild-regionsrv
要让该服务在系统启动时自动启动,请启用该服务:
> sudo systemctl enable containerbuild-regionsrv
SLE 基本映像提供的 Zypper 插件将连接到此服务,并检索身份验证细节以及有关要与哪个更新服务器通讯的信息。为此,必须在启用主机网络的情况下构建容器,例如:
> podman build --network host build-directory/
由于公有云中的更新基础架构基于 RMT 工作,因此,为不同于主机 SLE 版本的 SLE 版本构建 SLE 映像也存在同样的限制(参见注意:在已于 RMT 中注册的系统上构建映像)。