官方文档:
https://github.com/docker/docker-ce-packaging/tree/master/rpm
环境搭建:
安装并启动docker就行:
1 |
yum install docker-ce |
命令很简单:
1 2 3 4 |
git clone https://github.com/docker/docker-ce-packaging.git cd docker-ce-packaging git clone https://github.com/docker/docker-ce.git make ENGINE_DIR=$(pwd)/docker-ce/components/engine CLI_DIR=$(pwd)/docker-ce/components/cli rpm |
打包原理:
从make命令说起,通过docker容器对engine cli分别进行打包,通过git获取版本号信息,通过docker-ce-packaging/rpm/Dockerfile.x86_64 构建一个基于centos:7 的容器镜像,镜像中安装编译环境(golang),容器挂载外部的一些目录,即,输入来自于外部目录,编译结果输出到外部目录;容器镜像直接启动rpmbuild命令进行构建,构建的详细步骤都在rpm的spec文件中,构建过程中还需要下载有些其他的源码
部分细节:
rpmbuild 命令:
1 2 |
cd /root/rpmbuild rpmbuild -ba --define '_gitcommit ef0da45' --define '_release 0.0.dev.git20180315.033056.0.ef0da45' --define '_version 0.0.0' --define '_origversion 0.0.0-dev' --define '_experimental 0' SPECS/docker-ce.spec |
容器挂载的外部目录:
1 |
-v /data3/docker-ce-packaging/rpm/rpmbuild/SOURCES:/root/rpmbuild/SOURCES -v /data3/docker-ce-packaging/rpm/rpmbuild/BUILD:/root/rpmbuild/BUILD -v /data3/docker-ce-packaging/rpm/rpmbuild/BUILDROOT:/root/rpmbuild/BUILDROOT -v /data3/docker-ce-packaging/rpm/rpmbuild/RPMS:/root/rpmbuild/RPMS -v /data3/docker-ce-packaging/rpm/rpmbuild/SRPMS:/root/rpmbuild/SRPMS -v /data3/docker-ce-packaging/rpm/systemd:/systemd |
问题记录:
- git 版本需要支持 -C 选项
- engine 的路径不小心写错了,导致engine的源码文件没有打进去,修改后OK
构建优化:
- 将github.com 解析到自己的代理服务器,加速下载构建中依赖的代码
- 将Dockerfile.x86_64中golang安装包下载地址修改为国内地址,只需将golang.org 修改为golang.google.cn 即可,加速下载golang安装包,当然,更快的办法是改为本地的地址
- 更快的办法是,自己build一个自己的环境,用完也不要销毁,每次自己直接执行rpmbuild -ba docker-ce.spec 就行了,不过注意:
- 构建过程中需要git clone一些代码,如果目录已经存在,就报错的,所以,可以做一个假的git,使得目录已存在就不再clone,这样还快些