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 扩展和模块添加到映像中”。
从 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 中注册,则默认行为只允许构建其代码库与主机相同的容器。例如,如果您的容器主机是 SLE 15 系统,则默认只能在该主机上构建基于 SLE 15 的映像。要为不同的 SLE 版本(例如,SLE 15 主机上的 SLE 12)构建映像,可将目标版本的主机计算机身份凭证插入到容器中(如下所述)。请注意,如果 RMT 服务器使用自我签名证书,则需要将匹配的 CA 证书添加到 CA 可信证书储存区/rmt-server.pem
中的容器才能接受证书。
如果主机系统已在 SUSE Customer Center 中注册,则此限制不适用。
在公有云(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 文档。
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