https://zhuanlan.zhihu.com/p/366671300
最近因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit
buildkitd默认运行在前台的,如果需要后面加一个 &
使用 --oci-worker=false --containerd-worker=true 参数,可以让buildkitd服务使用containerd后端
buildkitd --oci-worker=false --containerd-worker=true &
创建配置文件
mkdir -p /etc/buildkit/
vim /etc/buildkit/buildkitd.toml
配置使用containerd后端,禁用oic后端,并把默认名字空间改为"default"(这是为了以后和nerdctl配合使用),把平台限制为本机类型amd64,配置垃圾回收空间限制
[worker.oci]
enabled = false
[worker.containerd]
enabled = true
# namespace should be "k8s.io" for Kubernetes (including Rancher Desktop)
namespace = "default"
platforms = [ "linux/amd64" ]
gc = true
# gckeepstorage sets storage limit for default gc profile, in MB.
gckeepstorage = 9000
用此配置启动服务
buildkitd --config /etc/buildkit/buildkitd.toml &
参考 https://github.com/moby/buildkit/tree/master/examples/systemd/system
首先,把 之前下载解压出来的bin目录里的文件拷贝到系统目录下(那个目录里其他文件用不上)
cd bin
cp buildctl /usr/local/bin
cp buildkitd /usr/local/bin
增加服务配置文件
vim /usr/lib/systemd/system/buildkit.service
如下
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit
[Service]
Type=notify
ExecStart=/usr/local/bin/buildkitd --addr fd://
[Install]
WantedBy=multi-user.target
增加socket配置文件
vim /usr/lib/systemd/system/buildkit.socket
如下
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660
[Install]
WantedBy=sockets.target
激活并启动服务
systemctl enable buildkit
systemctl start buildkit
注意:如果配置文件 /etc/buildkit/buildkitd.toml 存在,服务启动时会自动装载该配置文件
buildctl build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=docker.io/username/image:tag
解释:
ctr -n buildkit i ls
注意:
/etc/buildkit/buildkitd.toml
ctr -n buildkit i push -u username:password docker.io/username/image:tag
注意:
registry的帐号密码配置在 ~/.docker/config.json 文件中 , 沿用了Docker的配置,虽然我们并没有装Docker
{
"auths": {
"docker.io": {
"auth": "base64(username:password)"
}
}
}
执行构建并推送到registry
buildctl build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=docker.io/username/image:tag,push=true
解释:
buildctl build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=docker.io/username/image:tag,push=true
--export-cache type=inline
注意:
以目前短暂的经验,buildkit构建的镜像一般至少会比Docker构建的镜像小10% , 最多的会小50% 多.