最近在学习常用的容器运行时 containerd, 本篇我就来介绍如何本地构建 containerd 进行调试开发,主要介绍2种 常规方式和使用容器构建,由于本地环境限制,我主要是使用 docker 搭建本地调试环境。

非容器 build

这里先开始介绍常规直接从源码本地构建的方式。

构建环境要求

1 go1.19.x及以上版本

2 Protoc 3.x+

3 适用于您的发行版的 Btrfs 标头和库。请注意,可以通过构建标签禁用构建 btrfs 驱动程序no_btrfs,从而删除此依赖项。

前面2点相信大家都很清楚,第三点的 Btrfs 是什么呢?Btrfs是一种现代的Linux写时复制(COW)文件系统,旨在实现先进的功能,同时也注重容错、修复和简易管理。

build

1 拉取containerd 源代码至本地

2 构建

进入源代码根目录,执行一下命令:

1
2
cd containerd
make

执行后,会在 ./bin/ 目录下生成所有项目的二进制文件。

如果你需要修改 gRPC API ,修改后需要使用 protoc 编译生成新的代码: make generate

docker 容器构建

接下来讲解怎么通过 docker 构建本地 containerd 调试环境。

构建要求

1 go1.19.x及以上版本

2 Protoc 3.x+

3 docker

构建

进入源代码根目录 cd containerd, 执行以下命令:

1
2
docker run -it     -v ${PWD}/containerd:/go/src/github.com/containerd/containerd     -e GOPATH=/go     -w /go/src/github.com/containerd/containerd golang:1.19
make && make install

这将会进行 containerd 的构建,过了一会发现构建失败,错误信息如下:

1
2
3
4
5
6
go build  -gcflags=-trimpath=/go/src -buildmode=pie  -o bin/containerd -ldflags '-X github.com/containerd/containerd/version.Version=v1.6.0-beta.3-1838-g4c44ec702.m -X github.com/containerd/containerd/version.Revision=4c44ec702fccbfdbe1e14382d21a8123fd5774a9.m -X github.com/containerd/containerd/version.Package=github.com/containerd/containerd -s -w ' -tags "urfave_cli_no_docs"  ./cmd/containerd    
# github.com/containerd/btrfs
vendor/github.com/containerd/btrfs/btrfs.go:21:10: fatal error: btrfs/ioctl.h: No such file or directory
   21 | #include <btrfs/ioctl.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.

看了一下,可能这个镜像没有 Btrfs 需要执行 apt-get update && apt-get install -y --no-install-recommends libbtrfs-dev 。执行完继续构建,过了一会可以看到构建成功。

img.png

如果你想要完整的容器运行时,你还需要 runc 的支持,我们拉取 runc 的源代码至本地,修改前面的 docker 允许命令:

1
docker run -it     -v /var/lib/containerd     -v ${PWD}/runc:/go/src/github.com/opencontainers/runc     -v ${PWD}/containerd:/go/src/github.com/containerd/containerd     -e GOPATH=/go     -w /go/src/github.com/containerd/containerd golang:1.19

接下来我们跟前面一样先构建 containerd:

1
2
cd /go/src/github.com/containerd/containerd
make && make install

containerd 构建好了,我们来构建 runc:

1
2
cd /go/src/github.com/opencontainers/runc
make && make install

过了一会,可以看到 runc 已经构建成功。

img_1.png

小结

本文简单介绍了2种构建本地 containerd 调试环境的方式,主要介绍了使用 docker 构建的过程。

参考