Buildah是一个命令行工具,他提供了一种灵活、可脚本编程式的构建容器镜像的功能,并且其构建出的镜像符合OCI(开放容器标准),可以与通过Docker方式构建出的镜像兼容,即通过Buildah构建出的镜像可以通过Docker与Kubernetes运行。Buildah 可以轻松与脚本集成并生成构建流水线,最大优势在于构建镜像的过程不再需要运行Docker的守护进程。
![](https://img.haomeiwen.com/i15374146/6cc7273c8ba2d7df.png)
特点
Buildah支持通过其原生命令来构建容器镜像,支持对云原生应用程序中所需的部分进行定制。Buildah通过一种简单且安全的方式来构建容器镜像,并且可以避免安装那些最终容器镜像不需要的组建,例如yum,dnf等,消除了镜像的过于臃肿。另外,由于Buildah无需类似Docker守护进程的支持,它也可以更加方便的在容器里面执行。
Buildah在构建镜像期间,支持对外部卷进行读写操作,这样在构建过程中可以引用外部卷中的镜像文件,而在生成最终镜像时却不用将外部卷的内容装载到最终镜像中。
构建过程
buildah通过脚本或者命令来构建容器镜像过程如下:
1:获取基础镜像openjdk:8-jdk-alpine
buildah from openjdk
2:将jar包拷贝到镜像中
buildah copy openjdk-working-container demo-1.0.0-SNAPSHOT.jar /tmp/demo-1.0.0-SNAPSHOT.jar
3:配置容器启动入口点
buildah config --entrypoint "java -jar /tmp/demo-1.0.0-SNAPSHOT.jar" openjdk-working-container
4:通过commit命令将其保存为镜像文件
buildah commit openjdk-working-container buildah-demo-image
![](https://img.haomeiwen.com/i15374146/3916955ad4bb7a58.png)
buildah通过dockerfile构建容器镜像过程如下,直接通过buildah build-using-dockerfile替代docker build指令便可实现,
![](https://img.haomeiwen.com/i15374146/7b8a0229c3e7f4b2.png)
与Docker异同
Buildah也可以作为docker build命令的一种替换。通常我们通过Docker根据Dokcerfile构建容器镜像时需要通过docker build命令,如 " docker build -t hello . ",然而通过Buildah的build-using-dockerfile(或bud)可以实现与docker build的等价替换,即 " bud -t hello . "等价于" docker build -t hello . ",可以轻松地实现与现有Dockerfile构建脚本的结合使用。同样构建结束之后,我们可以通过" buildah images "命令查看通过Buildah构建出的容器镜像,通过" buildah push {repository} "命令将容器镜像文件推送到远程仓库。
虽然 "docker build" 与 "build-using-dockerfile" 命令最终都可以构建出容器镜像,但是构建构建过程略有不同。通过Docker构建镜像时,每执行一条Dockerfile中的指令,都会对上一层生成的镜像通过增加扩充的形式生成新的一层。而Buildah则是通过无缓冲的形式进行构建,从头至尾依次执行构建脚本文件中的命令,最终生成容器镜像文件,这种构建方式可以十分有效的提高构建效率,在构建复杂的容器镜像时优势尤为明显,但缺失了中间缓存层会造成在每次构件时都会重复执行构建指令。
网友评论