文章目录
  1. 1. 安装 buildah
  2. 2. 使用 Dockerfile 构建镜像
  3. 3. 使用 buildah 命令构建
  4. 4. 多架构镜像构建

目前使用了 docker build 和 docker buildx 来打包镜像,但这个管理镜像和打包镜像还不够灵活,依赖 docker daemon 不太方便。buildah 可以在不开 docker 的情况下打包镜像,非常适合在 ci/cd 的环境下使用,而且支持了多架构的打包,兼容 Dockerfile 以及 bash script 直接调用 buildah 命令的方式构建镜像。

安装 buildah

在 manjaro 上安装只要 yay -S buildah 就可以。

使用 Dockerfile 构建镜像

由于我的 wsl 环境使用非 root 用户构建镜像一直有些问题,暂时就用 root 用户直接玩了。以下所有操作都在 root 环境下,理论上可以在非 root 环境执行。

开始构建前先在 /etc/containers/registries.conf 里面增加 unqualified-search-registries 配置,兼容以前的 Dockerfile FROM 地址。

1
unqualified-search-registries = ['docker.io']

执行下面这条命令就会构建 Dockerfile

1
buildah bud -t nginx:local

使用 buildah 命令构建

本质上使用 buildah 的命令构建是写了一个 bash 脚本,所以里面的写法在调试的时候完全可以直接在命令行一条一条的尝试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 基于镜像生成一个容器
ctr1=$(buildah from "nginx")

# 在容器里面执行命令,生成一个文件
buildah run "$ctr1" -- touch somefile

# 设置容器的注解信息
buildah config --annotation "com.example.build.host=$(uname -n)" "$ctr1"

# 设置 cmd 参数
buildah config --cmd "/usr/sbin/nginx" "$ctr1"
# 设置开放的端口
buildah config --port 80 "$ctr1"

## 提交容器修改到新的镜像
buildah commit "$ctr1" "nginx:modify"

多架构镜像构建

多架构依赖 qemu-user-static ,目前方便的方法是使用 https://github.com/multiarch/qemu-user-static 来处理 binfmt。

Docker 方式

1
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

Podman 方式

1
sudo podman run --rm --privileged multiarch/qemu-user-static --reset -p yes

构建指定架构的镜像

我这里使用了 Dockerfile

1
2
buildah bud --arch=arm64 -t nginx:arm64
buildah bud --arch=amd64 -t nginx:arm64

建立 manifest

1
2
3
buildah manifest create nginx:multiarch
buildah manifest add nginx:multiarch nginx:arm64
buildah manifest add nginx:multiarch nginx:amd64

上传 manifest

1
buildah manifest push --all nginx:multiarch docker://localhost:5000/nginx:multiarch

注意要增加 --all ,以便同时上传关联的镜像

文章目录
  1. 1. 安装 buildah
  2. 2. 使用 Dockerfile 构建镜像
  3. 3. 使用 buildah 命令构建
  4. 4. 多架构镜像构建