本文根據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引數,鏡
本文根據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引數,鏡