今天是2017年6月12日,在此之前Docker就已经更名为moby了,就moby的的编译与之前docker的编译无异,为什么呢,因为无论是docker还是moby,都将自己的编译放在了容器中,编译所依赖的包也在容器中完成安装,目前moby(以下都以此替代docker)能直接编译出rpm、deb两种安装包,具体支持哪些平台,哪些操作系统,请见./contrib/builder/
。
本文主要以编译centos7
能用的rpm包为例,对moby的编译配置文件进行了修改,从而使moby快速完成编译。
编译原理
1 | Debian:jessie |
Moby先创建一个Debian的容器,编译Moby,然后该容器根据用户输入的参数决定使用哪些容器编译哪些安装包,在编译目标安装包之前会使用golang容器编译manpage。总之moby的所有编译工作都是在容器中进行的。
编译方法
环境
- 宿主机
RHEL7.2 - docker
17.04.0-ce
RPM (Only CentOS)
- 获取 moby 代码
1
2
3
4clone moby
git clone https://github.com/moby/moby.git
切换到17.04.0-ce版本
git checkout -b building_v17.04.0-ce v17.04.0-ce - 修改Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32diff --git a/Dockerfile b/Dockerfile
index 8a361ce..3d6b0bb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -34,8 +34,12 @@ COPY keys/launchpad-ppa-zfs.asc /go/src/github.com/docker/docker/keys/
RUN apt-key add /go/src/github.com/docker/docker/keys/launchpad-ppa-zfs.asc
RUN echo deb http://ppa.launchpad.net/zfs-native/stable/ubuntu trusty main > /etc/apt/sources.list.d/zfs.list
+RUN apt-get clean
+RUN apt-get update -o Acquire::http::No-Cache=True
+
# Packaged dependencies
-RUN apt-get update && apt-get install -y \
+# RUN apt-get update && apt-get install -y \
+RUN apt-get install -y \
apparmor \
apt-utils \
aufs-tools \
@@ -112,10 +116,12 @@ ENV PATH /osxcross/target/bin:$PATH
ENV SECCOMP_VERSION 2.3.2
RUN set -x \
&& export SECCOMP_PATH="$(mktemp -d)" \
- && curl -fsSL "https://github.com/seccomp/libseccomp/releases/download/v${SECCOMP_VERSION}/libseccomp-${SECCOMP_VERSION}.tar.gz" \
+ # && curl -fsSL "https://github.com/seccomp/libseccomp/releases/download/v${SECCOMP_VERSION}/libseccomp-${SECCOMP_VERSION}.tar.gz" \
+ && curl -fsSL "https://github.com/seccomp/libseccomp/archive/v${SECCOMP_VERSION}.tar.gz" \
| tar -xzC "$SECCOMP_PATH" --strip-components=1 \
&& ( \
cd "$SECCOMP_PATH" \
+ && ./autogen.sh \
&& ./configure --prefix=/usr/local \
&& make \
&& make install \ - 去掉DM(DeviceMapper)支持
1
2
3
4
5
6
7
8
9
10
11
12
13diff --git a/hack/make/.integration-daemon-start b/hack/make/.integration-daemon-start
index 0bc8b96..bea0d70 100644
--- a/hack/make/.integration-daemon-start
+++ b/hack/make/.integration-daemon-start
@@ -71,7 +71,7 @@ if [ -z "$DOCKER_TEST_HOST" ]; then
( set -x; exec \
dockerd --debug \
--host "$DOCKER_HOST" \
- --storage-driver "$DOCKER_GRAPHDRIVER" \
+ # --storage-driver "$DOCKER_GRAPHDRIVER" \
--pidfile "$DEST/docker.pid" \
--userland-proxy="$DOCKER_USERLANDPROXY" \
$storage_params \ - 由于GFW的原因,去掉manpage中关于
golang.org/x/sys
的安装1
2
3
4
5
6
7
8
9
10
11
12
13
14
15diff --git a/man/glide.lock b/man/glide.lock
index 5ec765a..2ecad45 100644
--- a/man/glide.lock
+++ b/man/glide.lock
@@ -38,10 +38,6 @@ imports:
version: dabebe21bf790f782ea4c7bbd2efc430de182afd
- name: github.com/spf13/viper
version: c1ccc378a054ea8d4e38d8c67f6938d4760b53dd
-- name: golang.org/x/sys
- version: 62bee037599929a6e9146f29d10dd5208c43507d
- subpackages:
- - unix
- name: gopkg.in/yaml.v2
version: a83829b6f1293c91addabc89d0571c246397bbf4
- name: github.com/spf13/cobra - 删除
amd64
平台下的与centos7
无关的目录1
2
3
4
5
6
7rm -rvf contrib/builder/rpm/amd64/amazonlinux-latest/
rm -rvf contrib/builder/rpm/amd64/fedora-24/
rm -rvf contrib/builder/rpm/amd64/fedora-25/
rm -rvf contrib/builder/rpm/amd64/opensuse-13.2/
rm -rvf contrib/builder/rpm/amd64/oraclelinux-6/
rm -rvf contrib/builder/rpm/amd64/oraclelinux-7/
rm -rvf contrib/builder/rpm/amd64/photon-1.0/ - 修改
contrib/builder/rpm/amd64/centos-7/Dockerfile
由于docker 17.04.0-ce这个版本是由golang1.7.5这个版本所编译的,所以在centos容器中需要安装golang1.7.5,而golangtc.com上没有1.7.5这个版本,所以只能通过vpn去golang.org上获取1
2
3
4
5
6
7
8
9
10
11
12
13
14diff --git a/contrib/builder/rpm/amd64/centos-7/Dockerfile b/contrib/builder/rpm/amd64/centos-7/Dockerfile
index 5986dfd..b1f024d 100644
--- a/contrib/builder/rpm/amd64/centos-7/Dockerfile
+++ b/contrib/builder/rpm/amd64/centos-7/Dockerfile
@@ -9,7 +9,9 @@ RUN yum -y swap -- remove systemd-container systemd-container-libs -- install sy
RUN yum install -y btrfs-progs-devel device-mapper-devel glibc-static libseccomp-devel libselinux-devel libtool-ltdl-devel pkgconfig selinux-policy selinux-policy-devel systemd-devel tar git cmake vim-common
ENV GO_VERSION 1.7.5
+ENV https_proxy 192.168.1.230:1080
RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
+# RUN curl -fSL "https://www.golangtc.com/static/go/${GO_VERSION}/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
ENV PATH $PATH:/usr/local/go/bin
ENV AUTO_GOPATH 1 - 使用Makefile编译Moby
完成了上述Dockerfile的修改以后,可以使用make进行编译,由于我们需要编译的是rpm安装包,所以可直接使用make rpm
进行。更多编译操作,可通过make help
查看。
*** 目前,Moby的编译主要问题处在GFW对网络封锁上,如遇到其它问题,请第一时间确认该网络是否能访问,尤其是中国大陆地区。 ***
参考&鸣谢
- docker源代码编译
- 感谢同事为我提供的VPN服务