docker编译安装过程与问题处理 …


前言

在学习和使用docker和kubernates一段时间之后,想看看docker和kubernates的源码来学习一下docker和kubernates的核心特性是如何实现的。首先想到的就是clone下来源码,然后用vscode看代码和进行debug。这篇文章就是关于docker源码安装的步骤和如何解决遇到的问题的。


docker,docker-ee,docker-ce and moby

在进行docker源码安装的过程中,首先google了一下其他人源码安装的文章。
目前2020-06, 网上很多关于docker源码安装的文章是基于老的 docker 仓库进行build的,目前访问 docker 会被重定向到 moby
but what is moby?
根据官方文档说明 moby作为docker的upstream, 和docker的关系就像 fedora对rhel的关系。docker目前由docker公司单独维护,而moby被用作docker的rd lab。
此外docker-ee和docker-ce的关系就像是rhel和centos的关系。


build步骤

docker-ce build时需要docker和golang。
对,构建docker需要docker,应该是构建docker需要的依赖比较多,直接在docker中编译比较简单,但是这样没法使用IDE调试,只能使用delve或者gdb进行调试。
之后会研究下Makefile, 如果可以直接源码编译,用IDE调试还是方便很多。

  1. 安装docker

    curl -fsSL https://get.docker.com | bash -s
    
  2. 安装golang

    wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
    tar -zxf go1.14.4.linux-amd64.tar.gz -C /usr/local/
    mv /usr/local/go /usr/local/go1.14.4
    ln -sfT /usr/local/go1.14.4 /usr/local/go
    
  3. 配置go工作环境 在 ~/.bashrc 中间 添加

    export GOPATH=~/go
    export GOBIN=$GOPATH/bin
    export GOROOT=/usr/local/go
    export PATH=/usr/local/go/bin:$GOPATH/bin:$PATH
    
    source ~/.bashrc
    
  4. 构建

    make static DOCKER_BUILD_PKGS=static-linux
    
  5. 查看构建后的文件

    tree ./components/packaging/static/build/linux
    ./components/packaging/static/build/linux
    ├── docker
    │   ├── containerd
    │   ├── containerd-shim
    │   ├── ctr
    │   ├── docker
    │   ├── dockerd
    │   ├── docker-init
    │   ├── docker-proxy
    │   └── runc
    ├── docker-19.03.9.tgz
    ├── docker-rootless-extras
    │   ├── dockerd-rootless.sh
    │   ├── rootlesskit
    │   ├── rootlesskit-docker-proxy
    │   └── vpnkit
    └── docker-rootless-extras-19.03.9.tgz
    
    2 directories, 14 files
    
    

问题解决:

问题1:
这个问题在tag v19.03.9和v19.03.6中都存在

 => ERROR [gotestsum 3/3] RUN PREFIX=/build ./install.sh gotestsum                                                                                                                                                                                                      25.8s
 => [frozen-images 2/3] COPY contrib/download-frozen-image-v2.sh /                                                                                                                                                                                                       0.0s
 => CANCELED [frozen-images 3/3] RUN /download-frozen-image-v2.sh /build  buildpack-deps:jessie@sha256:dd86dced7c9cd2a724e779730f0a53f93b7ef42228d4344b25ce9a42a1486251  busybox:latest@sha256:bbc3a03235220b170ba48a157dd097dd1379299370e1ed99ce976df0355d24f0  busybo  2.9s
------                                                                                                                                                                                                                                                                        
 > [gotestsum 3/3] RUN PREFIX=/build ./install.sh gotestsum:                                                                                                                                                                                                                  
#27 0.491 + RM_GOPATH=0                                                                                                                                                                                                                                                       
#27 0.491 + TMP_GOPATH=                                                                                                                                                                                                                                                       
#27 0.491 + : /build                                                                                                                                                                                                                                                          
#27 0.491 + '[' -z '' ']'                                                                                                                                                                                                                                                     
#27 0.491 ++ mktemp -d                                                                                                                                                                                                                                                        
#27 0.492 + export GOPATH=/tmp/tmp.VkwiWxbVDC                                                                                                                                                                                                                                 
#27 0.492 + GOPATH=/tmp/tmp.VkwiWxbVDC                                                                                                                                                                                                                                        
#27 0.492 + RM_GOPATH=1                                                                                                                                                                                                                                                       
#27 0.493 ++ dirname ./install.sh                                                                                                                                                                                                                                             
#27 0.493 + dir=.                                                                                                                                                                                                                                                             
#27 0.493 + bin=gotestsum                                                                                                                                                                                                                                                     
#27 0.493 + shift
#27 0.493 + '[' '!' -f ./gotestsum.installer ']'
#27 0.493 + . ./gotestsum.installer
#27 0.493 ++ GOTESTSUM_COMMIT=v0.3.5
#27 0.493 + install_gotestsum
#27 0.493 + echo 'Installing gotestsum version v0.3.5'
#27 0.493 + go get -d gotest.tools/gotestsum
#27 0.493 Installing gotestsum version v0.3.5
#27 25.63 + cd /tmp/tmp.VkwiWxbVDC/src/gotest.tools/gotestsum
#27 25.63 + git checkout -q v0.3.5
#27 25.64 + go build -buildmode=pie -o /build/gotestsum gotest.tools/gotestsum
#27 25.72 handler.go:8:2: cannot find package "github.com/sirupsen/logrus" in any of:
#27 25.72   /usr/local/go/src/github.com/sirupsen/logrus (from $GOROOT)
#27 25.72   /tmp/tmp.VkwiWxbVDC/src/github.com/sirupsen/logrus (from $GOPATH)
------
failed to solve with frontend dockerfile.v0: failed to build LLB: executor failed running [/bin/sh -c PREFIX=/build ./install.sh $INSTALL_BINARY_NAME]: runc did not terminate sucessfully
make[3]: *** [build] Error 1
make[3]: Leaving directory `/home/jadd/go/src/github.com/docker/docker-ce/components/engine'
make[2]: *** [static-engine] Error 2
make[2]: Leaving directory `/home/jadd/go/src/github.com/docker/docker-ce/components/packaging/static'
make[1]: *** [static] Error 2
make[1]: Leaving directory `/home/jadd/go/src/github.com/docker/docker-ce/components/packaging'
make: *** [static] Error 2

解决:

首先想到得是安装上logrus模块,安装之后发现还是编译不通过。
然后仔细查看build输出,这个报错应该是发生在某个容器当中。
经过一番查找,这个应该是发生在 ./components/engine/hack/dockerfile/install/gotestsum.installer 中。在build之前增加

go get -d github.com/sirupsen/logrus

修改之后的脚本如下:

cat ./components/engine/hack/dockerfile/install/gotestsum.installer
#!/bin/sh

GOTESTSUM_COMMIT='v0.3.5'

install_gotestsum() {
    echo "Installing gotestsum version $GOTESTSUM_COMMIT"
    go get -d gotest.tools/gotestsum
    go get -d github.com/sirupsen/logrus
    cd "$GOPATH/src/gotest.tools/gotestsum"
    git checkout -q "$GOTESTSUM_COMMIT"
    go build -buildmode=pie -o "${PREFIX}/gotestsum" 'gotest.tools/gotestsum'
}

总结

可以看到使用 docker-ce 自带的 Makefile 进行编译还是很简单的, 接下来的问题就是如何搭建 go build 的编译环境, 这样方便进行调试.

参考文档

  1. demystifying-the-relationship-between-moby-docker
  2. compiling-your-own-forked-docker-release