获取地址:https://github.com/moby/buildkit/releases
BuildKit 由buildkitd守护进程和buildctl客户端组成。虽然buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd守护程序目前仅可用于 Linux。
启动buildkitd守护进程:
您需要buildkitd在主机上以 root 用户身份运行。(默认前台执行)
$ sudo buildkitd
要buildkitd以非 root 用户身份运行,参考https://github.com/moby/buildkit/blob/master/docs/rootless.md
buildkitd 守护进程支持两个工作后端:OCI (runc) 和 containerd。
默认情况下,使用 OCI (runc) 后端工作。可以设置--oci-worker=false --containerd-worker=true使用 containerd 后端。
buildkitd --oci-worker=false --containerd-worker=true &
用systemd管理,参考https://github.com/moby/buildkit#systemd-socket-activation
前端是在 BuildKit 中运行并将任何构建定义转换为 LLB 的组件。有一个名为 gateway ( gateway.v0)的特殊前端,它允许使用任何图像作为前端。(LLB二进制中间格式)
在开发过程中,Dockerfile 前端 ( dockerfile.v0) 也是 BuildKit 存储库的一部分。将来,这将被移出,并且可以使用外部映像构建 Dockerfile。
构建一个 Dockerfile buildctl
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. # or buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --opt target=foo \ --opt build-arg:foo=bar
--local 将本地源文件从客户端公开给构建器(就是特喵的目录)。
context是 Dockerfile 前端查找构建上下文,比如在从目录中拷贝文件到镜像里
Dockerfile 构建文件的位置目录。
--output 的 name 表示构建的镜像名称,镜像会存在本地containerd的buildkit命名空间下
buildkit命名空间在配置文件worker.containerd.namespace,要修改此命名空间, 可以去配置 /etc/buildkit/buildkitd.toml
显示本地构建缓存 ( /var/lib/buildkit )
如果需要凭据,buildctl将尝试读取 Docker 配置文件$DOCKER_CONFIG/config.json。 $DOCKER_CONFIG默认为~/.docker.
构建推送到registry
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name=docker.io/username/image:tag,push=true
name=[value]: 图像名称
push=true: 创建镜像后推送
push-by-digest=true: 推送未命名的图像
registry.insecure=true: 推送到不安全的 HTTP 注册中心
oci-mediatypes=true: 在配置 JSON 中使用 OCI 媒体类型而不是 Docker 的
unpack=true:创建后解压镜像(用于containerd)
dangling-name-prefix=[value]: 用 命名图像prefix@<digest>,用于匿名图像
name-canonical=true: 添加额外的规范名称 name@<digest>
compression=[uncompressed,gzip,estargz,zstd]: 为新创建和缓存的图层选择压缩类型,gzip 为默认值。esargz 应与oci-mediatypes=true.
force-compression=true:强制将compression选项应用于所有图层(包括已经存在的图层)。
buildinfo=[all,imageconfig,metadata,none]:选择要导出的构建依赖版本(默认all)。
使用缓存构建镜像并推送到registry
inline: 将缓存嵌入到镜像中,一起推送到注册表中
registry: 分别推送镜像和缓存
local: 导出到本地目录
gha: 导出到 GitHub Actions 缓存
buildctl build \ --frontend=dockerfile.v0 \ --local context=. \ --local dockerfile=. \ --output type=image,name=docker.io/username/image:tag,push=true --export-cache type=inline
将缓存一起推送到registry
,registry
需要type才能导入缓存,应该指定--export-cache type=inline
和--import-cache type=registry,ref=docker.io/username/image
。要将缓存导出到本地目录,应该指定--export-cache type=local
--export-cache 选项:
type=registry
mode=min (默认):仅导出结果图像的图层
mode=max:导出所有中间步骤的所有层。
ref=docker.io/user/image:tag: 参考
oci-mediatypes=true|false: 是否在导出的清单中使用 OCI 媒体类型。由于 BuildKitv0.8默认为 true。
--import-cache 选项:
type=registry
ref=docker.io/user/image:tag