我的docker随笔12:docker源码编译
因工作需要从源码编译docker,本文对此进行介绍。
一、环境搭建
docker的编译,需要在宿主机预先安装docker软件。因为编译docker的源码时,会构建一个docker镜像并运行,在这个容器里面进行build操作。由于这个容器已经包含了go语言环境,故宿主机无须额外安装golang。
宿主机系统:ubuntu 16.04 64bit
宿主机docker版本:
docker -v
Docker version 17.10.0-ce, build f4ffd25
二、下载源码
docker的github官方网站为:https://github.com/docker/docker-ce/。
docker以每月发布一个版本的节奏进行开发。命名规则为:年份-月份-ce
,其中ce表示社区版本。截至本文撰写时,最新版本为v17.12.0-ce
,但下一版本v18.01.0-ce-dev
已经处于开发阶段(带dev表示开发阶段),本文编译得到的版本即为v18.01.0-ce-dev
。
发行版本下载地址:https://github.com/docker/docker-ce/releases。
本文在/home/latelee/docker/dev
目录进行,请根据实际情况修改目录。
下载源码:
git clone https://github.com/docker/docker-ce
进入docker-ce目录:
cd docker-ce
切换到最新的tag:
git checkout -b v18.01.0-ce
三、编译过程
本节工作目录为/home/latelee/docker/dev/docker-ce目录。
修改Dockerfile
执行下面小节编译命令时会发生一个错误,因此需要预先修改Dockerfile文件。
编译时会构建一个docker镜像来编译,实际执行的命令是(来自components/packaging/deb的makefile,并经过解析生成的):docker build -t debbuild-ubuntu-xenial/x86_64 -f /home/latelee/docker/dev/docker-ce/components/packaging/deb/ubuntu-xenial/Dockerfile.x86_64 .
。
分析components/packaging/deb/ubuntu-xenial/Dockerfile.x86_64
文件,知道其在构建过程会下载golang编译器,因golang.org访问不了,最后会构建失败。因此需要更新下载源。解决方法:找一个国内可下载的网站。如https://dl.gocn.io/。
修改components/packaging/deb/ubuntu-xenial/Dockerfile.x86_64
文件。
将RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz"; | tar xzC /usr/local
修改为:RUN curl -fSL "https://dl.gocn.io/golang/${GO_VERSION}/go${GO_VERSION}.linux-amd64.tar.gz"; | tar xzC /usr/local
最终会构建出镜像:debbuild-ubuntu-xenial/x86_64
。
注意,这个镜像在后面的编译中会继续使用,因此不需要删除。
编译
进入目录:
cd components/packaging/deb
deb目录下的Makefile指定了编译得到的是deb包。
执行编译命令:
make VERSION=18.01.0-ce-dev ENGINE_DIR=/home/latelee/docker/dev/docker-ce/components/engine CLI_DIR=/home/latelee/docker/dev/docker-ce/components/cli ubuntu-xenial
命令解释:
该命令指定了版本号和docker组件的目录(VERSION、ENGINE、CLI分别指版本号、docker引擎、docker命令行),同时指定了要编译的系统版本(ubuntu16.04代号为xenial),这是因为,本文只针对一个系统版本进行编译,而不是编译所有的版本。
生成文件
大约经过半小时,编译成功。最终生成的deb包位于:components\packaging\deb\debbuild\ubuntu-xenial
。
deb文件为:docker-ce_18.01.0~ce~dev~git20171228.105814.0.486a48d-0~ubuntu_amd64.deb
安装
将得到的deb包存放到本机或其它ubuntu系统上,执行以下命令进行安装:
# dpkg -i docker-ce_18.01.0~ce~dev~git20171228.105814.0.486a48d-0~ubuntu_amd64.deb
验证其版本号:
# docker -v
Docker version 18.01.0-ce-dev, build 486a48d
到此,docker的编译结束。
四、docker源码目录剖析
docker-ce源码目录如下:
.
├── CHANGELOG.md
├── components # 组件目录
│ ├── cli
│ ├── engine
│ └── packaging
├── components.conf
├── CONTRIBUTING.md
├── Makefile # 编译所需
├── README.md # 说明文件
└── VERSION # 版本文件4 directories, 6 files
其中组件目录包含三个子目录:cli、engine、packaging。前2个为go代码所在目录,packaging是构建最终二进制文件的目录。内容如下:
.
├── deb
│ ├── build-deb
│ ├── common
│ ├── debbuild
│ ├── debian-buster
│ ├── debian-jessie
│ ├── debian-stretch
│ ├── debian-wheezy
│ ├── Makefile
│ ├── raspbian-jessie
│ ├── raspbian-stretch
│ ├── README.md
│ ├── systemd
│ ├── ubuntu-artful
│ ├── ubuntu-trusty
│ └── ubuntu-xenial
├── Jenkinsfile
├── Makefile
├── README.md
├── rpm
│ ├── centos-7
│ ├── fedora-26
│ ├── fedora-27
│ ├── gen-rpm-ver
│ ├── Makefile
│ ├── README.md
│ └── systemd
└── static├── hash_files└── Makefile
其中deb目录是编译生成deb文件的,区别不同的系统版本(如ubuntu和debian,而ubuntu又以代号区别不同版本,其中trusty表示14.04,xenial表示16.04,等等)。比如ubuntu-xenial目录包括了基于16.04的不同平台的Dockerfile。build-deb是运行于前面提到的容器的编译脚本。
详细分析将在后续文档给出。
附录
如果下载release版本进行编译,将得到如此错误:
# WARNING! I don't seem to be running in a Docker container.
# The result of this command might be an incorrect build, and will not be
# officially supported.
#
# Try this instead: make all
#
error: .git directory missing and DOCKER_GITCOMMIT not specifiedPlease either build with the .git directory accessible, or specify theexact (--short) commit hash you are building using DOCKER_GITCOMMIT forfuture accountability in diagnosing build issues. Thanks!
make[1]: *** [override_dh_auto_buil
解决方法:
使用git下载代码仓库,然后切换到发布版本分支,再进行编译。
由于docker版本更新非常快,本文所述,仅供参考。
我的docker随笔12:docker源码编译相关推荐
- postgresql 12.0 源码编译安装
postgresql 12.0 源码编译安装 1.安装相关软件包 su - root yum install -y cmake gcc gcc-c++ perl readline readline-d ...
- 团队环境搭建:使用docker快速架构AOSP源码编译环境(谷歌原版)
文章目录 1. 篇首语 2. 多环境的实现方案 3. docker 部署的基本步骤 4. docker 基础安装 4.1 前置知识 4.2 docker 引擎安装 4.3 添加用户到docker Gr ...
- flink 源码编译注意事项
1. Flink打包的时候,请务必从tag中拉取精确版本,而非从branch拉取.tag中标明了release-1.11.1 / release-1.11.2 / release-1.11.3,但是b ...
- centos 访问网页重启php_php项目上线基于docker运行php+源码编译实现Nginx+阿里云RDS连接实现...
项目背景: 公司项目上线要求运维把上线工作做好,并实现稳定性运行,活不多说,干! 环境要求: CentOS Linux release 7.2.1511 (Core) docker 版本:19.03. ...
- docker push 过程 distribution源码 分析
docker push 过程 distribution源码分析 承接上一篇"distribution structure and start up 分析"本文分析一下distrib ...
- Docker源码编译
官方建议docker源码编译在docker容器内进行,因为官方提供的容器内已经继承了编译需要的环境,如果非要自己搭建编译环境也不是不可以,就是稍微有些繁琐.以下以1.8.2版本为例. 1.pull d ...
- Docker源码编译(二)
这是根据自己项目修改而记录的过程,对他人不具有参考性 一.按照以下教程,搭建docker编译环境:Docker源码编译和开发环境搭建 二.由于我对docker源码的修改导入了mysql数据库的包,如下 ...
- 【flink】Flink 1.12.2 源码浅析 : Task数据输入
1.概述 转载:Flink 1.12.2 源码浅析 : Task数据输入 在 Task 中,InputGate 是对输入的封装,InputGate 是和 JobGraph 中 JobEdge 一一对应 ...
- 【flink】Flink 1.12.2 源码浅析 :Task数据输出
1.概述 转载:Flink 1.12.2 源码浅析 :Task数据输出 Stream的计算模型采用的是PUSH模式, 上游主动向下游推送数据, 上下游之间采用生产者-消费者模式, 下游收到数据触发计算 ...
最新文章
- 植物的意识,是我们的错觉吗?
- 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)
- 位图像素的颜色 携程编程大赛hdu
- 做系统ghost步骤图解_u盘装系统步骤
- delphi的多线程编程
- Java — Map.keySet()、Map.put()、Map.get()【Map类、Set类】
- ASP.NET中操作SQL数据库
- chemdraw怎么画拐弯的箭头_教你画系列,像金属一样有复杂反光的漆皮材质
- 零基础入门机器学习——声音识别——打卡Task1
- 如何在 R 中的直方图上叠加正态曲线(2 个示例)
- PHP如何调用实现奇亚(Chia)交互[支持XCH]
- thinkphp下载MP4视频
- python battleship_一个python初学者的作业,battleship
- 【历史上的今天】5 月 4 日:微软放弃收购雅虎;史上最危险的电脑病毒;vi 发布
- 国培计算机网络技术培训心得,2017国培学习心得体会及感受
- 海尔笔记本X3超级本拆机增加内存图文教程(解决后盖开不了问题)
- kaldi教程_赠书 | 全球稀缺的Kaldi学习资料,《Kaldi语音识别实战》给补上了
- 经典文献阅读之--PON
- 微信小程序获取输入框(input)内容
- 前后端分离项目-我爱蜗家网站平台
热门文章
- iphone录屏没内部声音_6个iPhone隐藏功能,让你的手机好用到飞起
- 有赞再推视频号流量扶持政策 单商家单月最高可获5万流量奖励
- 京东健康股价创下新高 市值突破6000亿港元
- 国家广播电视总局:未实名制注册的用户不能打赏 未成年用户不能打赏
- 荣耀法定代表人由饶俊祥变更为万飚 注册资本增长2973%
- 武汉街头出现手机无线充电路灯,极速快充,但需注意这一点!
- 微信又上线新功能,能让你更会聊天?
- 董明珠宣布开启抖音直播卖货首秀,对刚“半价”直播罗永浩?
- 干得漂亮!签约“这辈子不可能打工”男子的经纪公司将被拉黑
- 刘强东夫妇向英国捐赠大量防疫物资:在英华侨及留学生可免费认领