最近在学习常用的容器运行时 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 构建
进入源代码根目录,执行一下命令:
cd containerd
make
执行后,会在 ./bin/ 目录下生成所有项目的二进制文件。
如果你需要修改 gRPC API ,修改后需要使用 protoc 编译生成新的代码: make generate
docker 容器构建
接下来讲解怎么通过 docker 构建本地 containerd 调试环境。
构建要求
1 go1.19.x及以上版本
2 Protoc 3.x+
3 docker
构建
进入源代码根目录 cd containerd
, 执行以下命令:
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 的构建,过了一会发现构建失败,错误信息如下:
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
。执行完继续构建,过了一会可以看到构建成功。
如果你想要完整的容器运行时,你还需要 runc 的支持,我们拉取 runc 的源代码至本地,修改前面的 docker 允许命令:
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:
cd /go/src/github.com/containerd/containerd
make && make install
containerd 构建好了,我们来构建 runc:
cd /go/src/github.com/opencontainers/runc
make && make install
过了一会,可以看到 runc 已经构建成功。
小结
本文简单介绍了2种构建本地 containerd 调试环境的方式,主要介绍了使用 docker 构建的过程。