1 概述:
1.1 环境
版本信息如下:
a、操作系统: centos 7.6,amd64
b、服务器docker版本: v18.06.0
c、服务器git版本: 1.8.3.1
d、目标编译的docker版本: v18.09.2
2 前置准备
2.1 宿主机安装docker
编译环境是一个容器,因此需要在宿主机安装容器引擎,在后续的步骤中运行出一个容器来编译目标软件docker-ce v18.09.2。
yum install yum-utils -y
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates
yum install -y docker-ce-18.06.0.ce-3.el7
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://bxsfpjcb.mirror.aliyuncs.com", "https://registry.docker-cn.com"],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"live-restore": true,
"exec-opts": ["native.cgroupdriver=systemd"],
"graph": "/var/lib/docker"
}
EOF
systemctl daemon-reload
systemctl enable docker
systemctl restart docker
2.2 构建编译环境镜像
将docker-ce/components/engine目录下的Dockerfile拿到阿里云镜像服务进行构建,得出的镜像为:
registry.cn-shenzhen.aliyuncs.com/gzlj/docker-build:v18.09.2
3 编译过程:
3.1 下载docker-ce源码
mkdir -p /opt
cd /opt
git clone -b v18.09.2 https://gitee.com/zjuhunter/docker-ce.git
cd docker-ce/components/engine
3.2 启动编译环境容器并执行编译脚本
当前位于宿主机的/opt/docker-ce/components/engine目录中,启动编译环境的容器,挂载源码目录进容器,执行docker-ce中的hack/make.sh脚本,稍等数分钟即可完成编译,最终在源码目录下的bundles/binary-daemon/目录中出现一堆二进制文件。
docker run \
--rm \
-it \
--privileged \
-v $PWD:/go/src/github.com/docker/docker \
registry.cn-shenzhen.aliyuncs.com/gzlj/docker-build:v18.09.2 \
bash
# 现在已进入容器内部,执行编译脚本
export DOCKER_GITCOMMIT=v18.09.2
hack/make.sh binary
4 总结:
docker-ce项目并不是使用go module的方式进行管理依赖,进入编译环境后,不需要执行任何与依赖相关的指令(例如go get等)。如果强制将docker-ce项目变成go module项目,执行编译脚本会出现依赖相关的错误和代码中出现未定义字段错误。