docker(moby)源码解析--Makefile

了解moby文件夹:

/api:命令行客户端与守护进程daemon通讯的http API,也可以用第三方软件控制daemon

     /type:客户端与服务端共享的数据类型   

        swagger.yaml:生成API文档的依据。主要分成两部分:

/cli:

/client:docker命令使用这个包与守护进程通信。它还可以用于您自己的Go应用程序,用于执行命令行界面——运行容器、拖动图像、管理集群等。

/cmd:  docker.go包含了docker daemon的主函数

/contrib:这个设计目录包含脚本、图像和其他一些不属于核心docker分布的有用的东西.

/daemon:

/distribution:

moby编译:

moby编译通docker源码编译一样,是在容器中编译所以需要先安装docker并启动:git下载源码,在moby跟目录下make build,在makefile可以看到该指令是docker用dockerfile创建镜像,如果出现错误可以到dockerfile查找出错的问题。编译成功生成docker-dev容器。

查看Makefile中的make build

DOCKER_FLAGS := docker run --rm -i --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD)

build: bundles init-go-pkg-cache

docker build ${BUILD_APT_MIRROR} ${DOCKER_BUILD_ARGS} -t "$(DOCKER_IMAGE)" -f "$(DOCKERFILE)" .##用docker创建一个临时的容器,并在容器中基于DOCKERFILE创建image

    BUILD_APT_MIRROR :=$(if $(DOCKER_BUILD_APT_MIRROR),--build-arg APT_MIRROR=$(DOCKER_BUILD_APT_MIRROR))

    DOCKER_FLAGS := docker run --rm -i --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD)##创建docker容器时的命令行,用docker创建一个临时的容器,并在容器中基于DOCKERFILE创建image

    DOCKER_IMAGE := docker-dev$(if $(GIT_BRANCH_CLEAN),:$(GIT_BRANCH_CLEAN))##这是docker image参数,镜像名字是docker-dev,以当前docker版本作为tag

    DOCKERFILE := $(shell bash -c 'source hack/make/.detect-daemon-osarch && echo $${DOCKERFILE}')

运行:docker run --rm -i --privileged -e BUILDFLAGS -e KEEPBUNDLE -e DOCKER_BUILD_GOGC -e DOCKER_BUILD_PKGS -e DOCKER_CLIENTONLY -e DOCKER_DEBUG -e DOCKER_EXPERIMENTAL -e DOCKER_GITCOMMIT -e DOCKER_GRAPHDRIVER=devicemapper -e DOCKER_INCREMENTAL_BINARY -e DOCKER_REMAP_ROOT -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -v "sxf/code/go/github.com/moby/bundles:/go/src/github.com/moby/moby/bundles" -t "docker-dev:HEAD" bash

进入容器中:hack/make.sh binary 或者 make binary编译静态docker,make dynbinary编译动态;两者调用的都是hack/make.sh binary,查看make.sh可知是在bundles文件夹下,latest文件是向后兼容的链接,export DEST="bundles/$(basename "$bundle")"生成的文件夹下是你的二进制文件。

make.sh:

DEFAULT_BUNDLES=(
binary-daemon
dynbinary
test-integration
test-docker-py
cross

)

if [ $# -lt 1 ]; then
bundles=(${DEFAULT_BUNDLES[@]})
else

bundles=($@)

            for bundle in ${bundles[@]}; do

            循环将bundles参数传入bundle() 函数

            done

            source "$SCRIPTDIR/make/$bundle" "$@"

hack/make/binary: . hack/make/binary-daemon

hack/make/binary-daemon:source "${MAKEDIR}/.binary"

.binary:go build \
-o "$DEST/$BINARY_FULLNAME" \
"${BUILDFLAGS[@]}" \
-ldflags "
$LDFLAGS
$LDFLAGS_STATIC_DOCKER
$DOCKER_LDFLAGS
" \
$GO_PACKAGE

编译github.com/docker/docker/cmd/dockerd







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值