K&
随笔 - 71,  文章 - 0,  评论 - 7,  阅读 - 53084

获取地址: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   K&  阅读(3269)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示