在 Linux 上构建你自己的容器

Buildah 是一个开源工具,用于从头开始构建你自己的容器。
59 位读者喜欢这篇文章。
GitHub launches Open Source Friday 

Opensource.com

容器在中运行。这是因为容器技术允许网站和 Web 应用程序随着需求的增加而产生自己的新副本。它们是数亿人可以使用热门网站而这些网站不会在全球流量的压力下崩溃的原因。容器是一种 Linux 技术,这意味着它们依赖于 Linux 内核特有的代码(特别是cgroups和命名空间),因此当您运行容器时,您实际上是在运行 Linux。使用来自 quay.io 和 dockerhub.io 等站点的容器镜像,大多数人构建特定于其应用程序或用例的新容器。但这让一些人想知道:如果我的容器来自构建在另一个开发人员的容器之上的开发人员,那么这些容器来自哪里?不用担心,这不是无限循环。您可以从头开始构建容器,并且有一个很棒的开源工具叫做Buildah来帮助您完成它。

容器规范

容器发展于 Linux 容器 (LXC) 和 Docker 等项目,并且是 开放容器倡议 (OCI) 维护了容器的形式规范。一个正确组装的符合 OCI 定义的容器可以在任何符合 OCI 的容器引擎上运行,例如 Podman、Docker、CRI-O 等。

安装 Buildah

在 Fedora 和 CentOS 上,您可能已经安装了 Buildah。如果没有,您可以使用包管理器安装它

$ sudo dnf install buildah

在 Debian 和基于 Debian 的系统上

$ sudo apt install buildah

配置 Buildah

由于 Buildah 创建容器,因此为其配置环境与 Podman 的配置相同。无论您是否使用 Podman,在继续之前,配置您的系统以实现“无根”podman

从无到有构建容器

要构建一个全新的容器,不使用任何人的先前工作作为基础,您可以使用特殊名称scratch来告诉 Buildah 您想要创建一个空容器。 scratch指定不是镜像名称。 这是您免于使用现有镜像作为工作基础的豁免。

$ buildah from scratch

这个默认名为working-container的新容器具有少量元数据,并且实际上没有其他内容,并且它现在在后台秘密运行。 您可以使用containers子命令查看它

$ buildah containers
CONTAINER ID  BUILDER  ID  IMAGE NAME   CONTAINER NAME
dafc77921c0c     *         scratch      working-container

要运行容器,您必须首先使用unshare子命令(除非您以 root 身份运行 Buildah)

$ buildah unshare

确认您的工作容器没有功能(此实例中预期响应失败)

$ buildah run working-container sh
ERRO[0000] container_linux.go:349: starting container process caused "exec: \"sh\": executable file not found in $PATH"

添加到您的容器

要将命令添加到您的容器,您必须首先挂载它。 容器镜像默认存储在您的~/.local目录中

$ buildah mount working-container
~/.local/share/containers/storage/overlay/b76940e6fe4efad7a0adca3b5399ee12055ddd733bbe273120dcae36a2e6c12f/merged

将容器挂载到您的~/.local目录(或以 root 身份运行时为/var/lib/containers/),您可以使用包管理器添加包。 --releasever必须与您构建容器时运行的发行版匹配。

[Fedora]$ sudo dnf install --installroot \
~/.local/share/containers/storage/overlay/b76940e6fe4efad7a0adca3b5399ee12055ddd733bbe273120dcae36a2e6c12f/merged \
--releasever 33 \
bash coreutils \
--setopt install_weak_deps=false -y

添加包的确切方法取决于您的发行版及其使用的包管理器。 例如,在我的 Slackware 桌面上,我使用installpkg

[Slack]$ installpkg --root ~/.local/share/containers/storage/overlay/b76940e6fe4efad7a0adca3b5399ee12055ddd733bbe273120dcae36a2e6c12f/merged \
/tmp/bash-5.0.17-x86_64-1_SMi.txz

现在您可以运行容器并尝试一些简单的操作,例如启动 shell

$ buildah run working-container bash
# bash --version
GNU bash, version 5.0.17(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

配置您的容器

buildah config子命令让您可以访问常见属性,例如您希望容器启动时运行的默认命令、设置环境变量、设置默认 shell、定义作者、架构和主机名等等。 例如,假设您添加了一个包含名为motd.sh的 shell 脚本的包,并且您希望它在容器启动时运行

$ buildah config --author "Seth Kenlon" \
--os "Slackware" --shell /bin/bash \
--cmd /usr/bin/motd.sh working-container

分发您的容器

完成构建容器后,您可以使用commit子命令将其保存为镜像。

$ buildah commit working-container my_image

使用 Buildah 构建它

容器有时看起来很神奇,但它们不是魔法。 它们是从头开始构建的,并且足够灵活,一旦存在镜像,其他人可以使用它来构建新的容器和容器镜像,以满足不同的需求。 没有必要从头开始,但是如果您好奇镜像如何开始,或者您想尝试创建一个特定于您的要求的镜像,Buildah 是要使用的工具。

接下来要阅读的内容
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算行业工作,并且经常同时从事这两个行业。

3 条评论

有趣的文章。 感谢分享你的专业知识。

这在 ARCH 或 MANJARO 中究竟如何工作? 基于 PACMAN 的东西?

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.