前言
日常工作中,我喜欢 在 Docker 容器中运行 CI/CD 作业 。这免不了要构建项目需要的编译环境的镜像。这通常使用采用 在Docker 构建 Docker 镜像 ,其过程是在 docker:stable 镜像中,调用 docker buildx build    命令构建镜像。
最近在同事的推荐下,尝试使用 Buildah 构建镜像。可以认为 buildah 是 docker buildx build 的替代品。
本文参考 buildah tutorial ,记录下 buildah 的使用过程。详细内容,自行参考官方文档。
buildah的基本使用
buildah的安装
参考:buildah/install.md at main · containers/buildah
我这里选择直接在本机上安装。
sudo apt-get -y install buildah
buildah --help
A tool that facilitates building OCI images
......当然,也可以采用 docker-in-docker 的方式,在 buildah/buildah  镜像中使用 buildah 命令。
使用buildah构建镜像
参考:buildah/docs/tutorials/01-intro.md at main · containers/buildah
把 buildah 当作 docker build 使用就好。还是通过习惯的 Dockerfile reference 构建我们的镜像。
这是一个简单的 Dockerfile 。
FROM rockylinux:9.3
CMD echo "Hello, World!"构建镜像,并运行。
# 构建镜像
buildah build -f Dockerfile -t buildah-test:latest .
# 查看镜像
root@vultr ~/tmp# buildah images
REPOSITORY                     TAG      IMAGE ID       CREATED          SIZE
localhost/buildah-test         latest   123ae5b9fccf   56 seconds ago   181 MB
docker.io/library/rockylinux   9.3      9cc24f05f309   11 months ago    181 MB
# 但是使用docker是无法看到这个镜像的,因为存储位置不同
## 将该镜像复制到 Docker 守护进程存储其镜像的位置
buildah push localhost/buildah-test:latest docker-daemon:localhost/buildah-test:latest
# 使用docker命令查看这个镜像
root@vultr ~/tmp# docker images
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
localhost/buildah-test      latest    123ae5b9fccf   10 minutes ago   176MB
# 使用这个镜像,创建容器
root@vultr ~/tmp# docker run localhost/buildah-test:latest
Hello, World!
root@vultr ~/tmp# docker ps -a
CONTAINER ID   IMAGE                              COMMAND                   CREATED         STATUS                     PORTS                                                     NAMES
09460f36ead0   localhost/buildah-test:latest      "/bin/sh -c 'echo \"H…"   7 seconds ago   Exited (0) 6 seconds ago                                                             frosty_curie
docker rm frosty_curie
docker image rm localhost/buildah-test那能否直接通过 buildah 创建容器,而不是复制镜像到 docker 中使用。
# 当然可以。不够需要先创建容器,然后再进入容器
root@vultr ~/tmp# buildah run localhost/buildah-test:latest bash
Error: reading build container "localhost/buildah-test:latest": container not known
root@vultr ~/tmp [125]# buildah from localhost/buildah-test:latest
buildah-test-working-container
root@vultr ~/tmp# buildah containers
CONTAINER ID  BUILDER  IMAGE ID     IMAGE NAME                       CONTAINER NAME
5dc1bc69920c     *     123ae5b9fccf localhost/buildah-test:latest    buildah-test-working-container
root@vultr ~/tmp [125]# buildah run buildah-test-working-container bash
[root@5dc1bc69920c /]# 
root@vultr ~/tmp# buildah rm buildah-test-working-container
root@vultr ~/tmp# buildah rmi localhost/buildah-test最后
简单了解了 buildah 后,日常使用中如果有其他问题,直接问 chatgpt 即可。
有个问题是,为什么我们尝试使用 buildah ? 因为在 docker-in-docker 中构建镜像时 ,会有报错。当然报错可以解决:gitlab ci – Error during connect: Post “http://docker:2375/v1.24/auth”: dial tcp: lookup docker on 172.30.0.2:53: no such host – Stack Overflow 、Error during connect: Post http://docker:2375/v1.40/auth: dial tcp: lookup docker on x.x.x.x:53: no such host – GitLab CI/CD – GitLab Forum
所以啊,或许应该避免 docker-in-docker ,直接在主机上构建镜像即可。
或者可以尝试使用 buildah 。
