containerd的ctr没有build,commit功能,那么如何在没有docker使用contianderd的环境构建镜像

buildkit

可以通过专门的构建工具–buildkit进行构建。使用buildkit说明如下。

  • 服务端为buildkitd,和runc或containerd后端进行连接,目前只支持这两个后端。
  • 客户端为buildctl,负责解析镜像构建文件Dockerfile,并向服务端发出构建指令,所以客户端可以和服务端不在一台机器上,也不需要root权限之类。
  • 服务端默认使用runc后端,但是建议使用containerd后端,这样构建出的镜像就会存在containerd的buildkit名字空间下。
  • buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd服务端目前仅可用于 Linux。
# 1. 下载安装buildkit命令工具
$ wget https://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz
$ tar xvf buildkit-v0.10.4.linux-amd64.tar.gz
$ cp buildkit/bin/build* /usr/local/bin

# 2. 启动buildkitd服务
# ** buildkitd默认运行在前台,需要加&挂在后台运行 **
# 使用 --oci-worker=false --containerd-worker=true 参数,可以让buildkitd服务使用containerd后端

$ buildkitd --oci-worker=false --containerd-worker=true &
WARN[2022-08-31T11:56:53+08:00] using host network as the default
WARN[2022-08-31T11:56:53+08:00] git source cannot be enabled: failed to find git binary: exec: "git": executable file not found in $PATH
INFO[2022-08-31T11:56:53+08:00] found worker "rkw9bofa0oc3f7wka7sqgz9pj", labels=map[org.mobyproject.buildkit.worker.containerd.namespace:buildkit org.mobyproject.buildkit.worker.containerd.uuid:4c0c9e2e-17b7-4387-bc9f-500aa8487356 org.mobyproject.buildkit.worker.executor:containerd org.mobyproject.buildkit.worker.hostname:acp38-cd-region org.mobyproject.buildkit.worker.network:host org.mobyproject.buildkit.worker.snapshotter:overlayfs], platforms=[linux/amd64 linux/amd64/v2 linux/386]
INFO[2022-08-31T11:56:53+08:00] found 1 workers, default="rkw9bofa0oc3f7wka7sqgz9pj"
WARN[2022-08-31T11:56:53+08:00] currently, only the default worker can be used.
INFO[2022-08-31T11:56:53+08:00] running server on /run/buildkit/buildkitd.sock

$ ps -ef|grep buildkitd
root     15662   507  0 11:56 pts/1    00:00:00 buildkitd --oci-worker=false --containerd-worker=true
root     20347   507  0 11:57 pts/1    00:00:00 grep --color=auto buildkitd

# 3. 构建镜像
# 命令格式:
$ buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=hello:v1

# 参数说明:
# frontend:使用dockerfile作为前端
# local context: 指向当前目录,这是Dockerfile执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里。
# local dockerfile:指向当前目录,表示Dockerfile在此目录
# output 的 name: 表示构建后的镜像名称

# 构建完之后的镜像默认存储在buildkit命名空间

构建举例

$ ls
Dockerfile  hello

$ cat Dockerfile
FROM docker.io/library/alpine:3.14.0

COPY ./hello /
CMD ["/hello"]



$  buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=192.168.14.254/library/hello:v1
[+] Building 5.6s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                       0.2s
 => => transferring dockerfile: 105B                                                                                                                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                          0.2s
 => => transferring context: 2B                                                                                                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/alpine:3.14.0                                                                                                                                                                                                           2.3s
 => [internal] load build context                                                                                                                                                                                                                                          0.7s
 => => transferring context: 1.78MB                                                                                                                                                                                                                                        0.1s
 => [1/2] FROM docker.io/library/alpine:3.14.0@sha256:adab3844f497ab9171f070d4cae4114b5aec565ac772e2f2579405b78be67c96                                                                                                                                                     1.2s
 => => resolve docker.io/library/alpine:3.14.0@sha256:adab3844f497ab9171f070d4cae4114b5aec565ac772e2f2579405b78be67c96                                                                                                                                                     0.3s
 => => extracting sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f861aae63beeddb6b                                                                                                                                                                                  0.4s
 => [2/2] COPY ./hello /                                                                                                                                                                                                                                                   0.4s
 => exporting to image                                                                                                                                                                                                                                                     1.1s
 => => exporting layers                                                                                                                                                                                                                                                    0.8s
 => => exporting manifest sha256:f6f58e15c4819f74d3758c92c2480c4b4d13750e2f36f404abf099f4b765d9c0                                                                                                                                                                          0.1s
 => => exporting config sha256:c84df4c969709948a0ae19d7590985689eadd05ed27cb3d046d8e137d96c0d6f                                                                                                                                                                            0.1s
 => => naming to 192.168.14.254/library/hello:v1

$ ctr -n buildkit image ls
REF                             TYPE                                                 DIGEST                                                                  SIZE    PLATFORMS   LABELS
192.168.14.254/library/hello:v1 application/vnd.docker.distribution.manifest.v2+json sha256:f6f58e15c4819f74d3758c92c2480c4b4d13750e2f36f404abf099f4b765d9c0 3.7 MiB linux/amd64 -

$ ctr -n buildkit  run 192.168.14.254/library/hello:v1 hello
Hello From Golang!