K&

获取地址: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

 

将缓存一起推送到registryregistry需要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

 

posted on 2021-12-27 18:26  K&  阅读(3206)  评论(0编辑  收藏  举报