在 CentOS 9 中使用 Buildah 构建 Docker 镜像(无需 Docker 守护进程)

Buildah 是专为构建 OCI 容器镜像设计的工具,无需运行 Docker 守护进程。以下步骤包含基础镜像构建和多阶段构建实践:


1. 环境准备
# 更新系统并安装 Buildah
sudo dnf update -y
sudo dnf install -y buildah

# 验证安装
buildah --version


2. 构建基础镜像

示例:创建 Nginx 镜像

# 启动临时容器
container=$(buildah from centos:9)

# 安装 Nginx
buildah run $container dnf install -y nginx

# 配置端口和启动命令
buildah config --port 80 $container
buildah config --cmd "nginx -g 'daemon off;'" $container

# 提交为镜像
buildah commit $container my-nginx-image


3. 多阶段构建(Go 应用示例)

阶段 1:编译 Go 二进制文件

# 第一阶段:使用 Golang 镜像编译
compiler_container=$(buildah from golang:1.19)
buildah run $compiler_container sh -c "echo 'package main; import \"fmt\"; func main() { fmt.Println(\"Hello Buildah!\") }' > main.go"
buildah run $compiler_container go build -o /app main.go

阶段 2:创建最小化运行镜像

# 第二阶段:使用精简基础镜像
runner_container=$(buildah from alpine:latest)

# 从第一阶段复制二进制文件
buildah copy --from $compiler_container $runner_container /app /app

# 设置启动命令
buildah config --cmd "/app" $runner_container

# 提交最终镜像
buildah commit $runner_container multi-stage-app


4. 镜像管理
# 查看本地镜像
buildah images

# 导出为 Docker 格式
buildah push multi-stage-app docker-archive:multi-stage-app.tar

# 清理临时容器
buildah rm $container $compiler_container $runner_container


关键优势
  • 无守护进程:直接调用 Linux 内核功能(cgroups/namespaces)
  • 精细控制:每个 buildah run 生成独立层,支持增量构建
  • 兼容性:生成的镜像符合 OCI 标准,可在 Docker/Kubernetes 直接使用
  • 资源效率:多阶段构建显著减小镜像体积(示例中最终镜像约 10MB)

提示:使用 buildah bud 可直接通过 Dockerfile 构建,但命令行模式更灵活控制层生成。

更多推荐