Buildah
Buildah 是一个有助于构建 开放容器倡议 (OCI) 容器镜像的工具。 Buildah 软件包提供了一个命令行工具,可以用于
- 从头开始或使用镜像作为起点创建一个工作容器
- 从工作容器或通过 Dockerfile 中的指令创建一个镜像
- 镜像可以以 OCI 镜像格式或传统的上游 docker 镜像格式构建
- 挂载工作容器的根文件系统以进行操作
- 卸载工作容器的根文件系统
- 使用容器根文件系统的更新内容作为文件系统层来创建新镜像
- 删除工作容器或镜像
- 重命名本地容器
构建容器最广为人知的替代方案是 docker。 请注意,Buildah 不运行容器,为此您可能需要考虑 podman。
安装
安装 buildah 和 podman 软件包,或者对于开发版本,buildah-gitAUR 软件包。
配置
启用对构建非特权容器的支持
希望使用 Buildah 构建非特权容器的用户需要完成额外的设置步骤,在首次运行 podman 之前。
注意: 如果您正在构建专用于运行非特权容器的系统,请在添加任何用户之前按照以下步骤操作。 这样您就不必编辑
/etc/subuid
和 /etc/subgid
:useradd 将为您执行此操作,您只需以 root 身份运行 touch /etc/subgid
和 touch /etc/subuid
即可。最后,创建 /etc/subuid
和 /etc/subgid
以包含每个能够运行容器的用户的容器化 UID/GID 对的映射。[1] 以下示例适用于 root 用户(和 systemd 系统单元)以及示例用户 buildah
/etc/subuid
buildah:100000:65536
/etc/subgid
buildah:100000:65536
如果您在应用上述更改之前运行了 podman,则在尝试以非特权用户身份拉取镜像时会收到错误。 运行 podman system migrate
以修复它。
如果一切顺利,那么在注销并重新登录后,buildah images
应该不会导致错误
注意: 如果您看到访问
/run/user/0
时出错,那么您可能使用了 su 来成为您正在用于测试的用户 — 您应该以该用户身份登录,因为不带 --login
标志的 su 不会将 XDG_RUNTIME_DIR
和其他环境变量设置为正确的值。用法
请参阅 Buildah 教程。
故障排除
以无根模式运行的 Buildah/Podman 期望绑定挂载是共享的,检查它是否设置为私有
$ findmnt -o PROPAGATION /
PROPAGATION private
在这种情况下,请参阅 mount(8) § 共享子树操作 并临时将挂载设置为共享,使用:
# mount --make-shared /
要永久设置它,请编辑 /etc/fstab 并将 shared 选项添加到所需的挂载点并重新启动。 它将产生如下条目:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck> UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 defaults,shared 0 1