Moby(Docker)编译趟坑

今天是2017年6月12日,在此之前Docker就已经更名为moby了,就moby的的编译与之前docker的编译无异,为什么呢,因为无论是docker还是moby,都将自己的编译放在了容器中,编译所依赖的包也在容器中完成安装,目前moby(以下都以此替代docker)能直接编译出rpm、deb两种安装包,具体支持哪些平台,哪些操作系统,请见./contrib/builder/

本文主要以编译centos7能用的rpm包为例,对moby的编译配置文件进行了修改,从而使moby快速完成编译。

编译原理

1
2
3
4
5
6
7
8
 Debian:jessie
+-------------+ golang 1.7.5-alpine
| | +------------------------+
| Moby | ----- docker run -----> | docker manpage compile |
| Compile | +------------------------+ centos:7
| Container | +--------------------+
| | -------------- docker run ----------------------------> | build centos rpm |
+-------------+ +--------------------+

Moby先创建一个Debian的容器,编译Moby,然后该容器根据用户输入的参数决定使用哪些容器编译哪些安装包,在编译目标安装包之前会使用golang容器编译manpage。总之moby的所有编译工作都是在容器中进行的。

编译方法

环境

  • 宿主机
    RHEL7.2
  • docker
    17.04.0-ce

RPM (Only CentOS)

  • 获取 moby 代码

    1
    2
    3
    4
    # clone 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
    32
    diff --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
    13
    diff --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
    15
    diff --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
    7
    rm -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
    14
    diff --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对网络封锁上,如遇到其它问题,请第一时间确认该网络是否能访问,尤其是中国大陆地区。

参考&鸣谢