如何編譯Docker原始碼?聰明雪梨ac2021-01-11 23:14:07

本文根據docker官方給出的docker程式碼編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,但是由於國內的網路問題經常會編譯失敗,瞭解了編譯步驟後,也可以結合自身遇到的網路問題進行“規避”。

docker的編譯環境實際上是建立一個docker容器,在容器中對程式碼進行編譯。 如果想快速的檢視編譯環境搭建指導,而不關注環境搭建的機制和細節,可以直接跳到最後一章“總結”。

前提

機器上已經安裝了docker,因為編譯環境是個docker容器,所以要事先有docker(daemon),後面會建立個編譯環境容器,在容器裡面編譯程式碼。本文中使用物理機,物理機上執行著docker (daemon)。

機器(物理機)上安裝了git 。 後續使用git下載docker原始碼

機器(物理機)上安裝了make。

下載ubuntu 14。04的docker映象

下載docker原始碼

git clone

會把程式碼下載到當前目錄下,後面會把程式碼複製到容器中。

編譯前分析

官方給的編譯方法是make build 和 make binary等。下面先分析Makefile,看懂Makefile後,編譯環境的準備流程就比較清楚了。

Makefile

在下載的docker原始碼中可以看到它的Makefile,Makefile中比較關鍵的幾個引數:

DOCKER_MOUNT := $(if $(BIND_DIR),-v “$(CURDIR)/$(BIND_DIR):/go/src/github。com/docker/docker/$(BIND_DIR)”) DOCKER_MOUNT 表示建立容器時的mount引數。因為編譯環境是一個容器,在後續的步驟中啟動容器時使用DOCKER_MOUNT引數,會將物理機上的目錄mount給容器容器,容器中該目錄是編譯生成docker二進位制檔案的目錄。

DOCKER_FLAGS := docker run ——rm -i ——privileged $(DOCKER_ENVS) $(DOCKER_MOUNT) 這是後面建立docker容器時的命令列的一部分,其中包含了前面的DOCKER_MOUNT引數。

DOCKER_IMAGE := docker-dev$(if $(GIT_BRANCH),:$(GIT_BRANCH)) 這是docker image引數,鏡