Buildah OCI 镜像构建工具教程

Buildah 是一款专注于构建 OCI(Open Container Initiative)标准容器镜像的工具,由 Red Hat 开发维护。与 Docker 构建不同,Buildah 不需要守护进程,不需要 root 权限,也不需要完整的容器运行时。它提供了比 Dockerfile 更灵活的构建方式,可以通过脚本逐步构建镜像。本文介绍如何在搬瓦工 VPS 上使用 Buildah 构建容器镜像。

一、安装 Buildah

1.1 Ubuntu/Debian

apt-get update && apt-get install -y buildah
buildah --version

1.2 CentOS/RHEL

yum install -y buildah
buildah --version

二、使用 Dockerfile 构建

Buildah 兼容标准 Dockerfile,可以直接替代 docker build:

# 使用 Dockerfile 构建(与 docker build 用法相同)
buildah bud -t myapp:latest .

# 指定 Dockerfile 路径
buildah bud -f Dockerfile.prod -t myapp:prod .

# 设置构建参数
buildah bud --build-arg VERSION=1.0 -t myapp:v1.0 .

三、脚本化构建(Buildah 特色)

Buildah 最大的特色是支持通过命令行或脚本逐步构建镜像,无需 Dockerfile:

# 创建一个新的工作容器
container=$(buildah from alpine:3.19)

# 在容器中执行命令
buildah run $container -- apk add --no-cache curl nginx

# 复制文件到容器
buildah copy $container ./app /opt/app
buildah copy $container nginx.conf /etc/nginx/nginx.conf

# 设置环境变量
buildah config --env APP_ENV=production $container

# 设置工作目录
buildah config --workingdir /opt/app $container

# 设置启动命令
buildah config --cmd "nginx -g 'daemon off;'" $container

# 设置端口
buildah config --port 80 $container

# 提交为镜像
buildah commit $container myapp:latest

# 清理工作容器
buildah rm $container

3.1 完整构建脚本示例

cat > build.sh <<'SCRIPT'
#!/bin/bash
set -e

container=$(buildah from python:3.12-slim)

buildah run $container -- pip install --no-cache-dir flask gunicorn
buildah copy $container ./app /app
buildah config --workingdir /app $container
buildah config --port 8000 $container
buildah config --entrypoint '["gunicorn"]' $container
buildah config --cmd "--bind 0.0.0.0:8000 app:app" $container
buildah config --label maintainer="admin@example.com" $container

buildah commit --squash $container myflaskapp:latest
buildah rm $container

echo "Build complete: myflaskapp:latest"
SCRIPT
chmod +x build.sh && ./build.sh

四、镜像管理

# 查看本地镜像
buildah images

# 删除镜像
buildah rmi myapp:latest

# 推送镜像到仓库
buildah push myapp:latest docker://docker.io/username/myapp:latest

# 导出为 Docker 格式
buildah push myapp:latest docker-archive:myapp.tar

# 导出为 OCI 格式
buildah push myapp:latest oci-archive:myapp-oci.tar

五、挂载文件系统

Buildah 可以直接挂载容器的文件系统,方便修改文件:

container=$(buildah from alpine:3.19)
mountpoint=$(buildah mount $container)

# 直接操作文件系统
echo "Hello World" > $mountpoint/index.html
cp -r /opt/myapp/* $mountpoint/opt/

# 卸载并提交
buildah umount $container
buildah commit $container myapp:latest
buildah rm $container

六、与 Podman 和 Skopeo 协作

Buildah、PodmanSkopeo 共同组成容器工具生态:

  • Buildah:负责构建镜像。
  • Podman:负责运行容器。
  • Skopeo:负责镜像的复制和管理。
# Buildah 构建 → Podman 运行 → Skopeo 推送
buildah bud -t myapp:latest .
podman run -d -p 8080:80 myapp:latest
skopeo copy containers-storage:myapp:latest docker://registry.example.com/myapp:latest

七、常见问题

存储驱动错误

# 检查存储配置
cat /etc/containers/storage.conf

# 确保使用 overlay 驱动
# [storage]
# driver = "overlay"

总结

Buildah 为容器镜像构建提供了灵活且安全的方案。它的脚本化构建方式特别适合需要精细控制构建过程的场景。结合 Podman 运行和 Skopeo 管理,可以完全替代 Docker 工具链。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。