docker编译安装
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调试还是方便很多。
安装docker
curl -fsSL https://get.docker.com | bash -s
安装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
配置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
构建
make static DOCKER_BUILD_PKGS=static-linux
查看构建后的文件
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 的编译环境, 这样方便进行调试.