如何編譯Docker原始碼

2021-08-01 17:04:27 字數 3786 閱讀 2827

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

官方給的編譯方法是make build 和 make binary等。下面先分析makefile,看懂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-dev,以當前git中docker版本作為tag名。這個映象是在make build一步做出來的。

docker_run_docker := $(docker_flags) "$(docker_image)" 建立docker容器的命令列,組合了前面的docker_flags 和 docker_image 。 從命令列中可以看出,啟動容器使用的引數有 --rm -i --privileged,使用了一些環境變數,還有使用了-v引數把物理機上目錄mount給容器,在容器中編譯好二進位制檔案後放到該目錄中,在物理機上就能獲得docker二進位制檔案。啟動的的docker 容器映象名字是docker-dev。下文會介紹docker-dev映象是怎麼來的。

由於官方給出的「構建編譯環境」的方法是執行 make build,下面在makefile中看到build分支是這樣的:

make build時會呼叫 docker build -t "$(docker_image)" . 去製作乙個叫做docker_image的映象。

進行原始碼編譯的方式是執行 make binary來編譯**,在makefile中make binary的分支如下:

make binary除了進行 make build以外,會執行$(docker_run_docker),即上文提到的docker run命令列。由於執行過了build,會build出來docker-dev映象,所以在docker run時直接使用前面build出來的映象。docker run時的命令列引數是hack/make.sh binary。make binary的過程實際上是建立乙個容器,在容器中執行hack/make.sh binary指令碼。接下來會詳細介紹make build和make binary所做的內容。

根據官方的指導,先執行make build來搭建編譯環境。上面分析了,make build實際上是製作了乙個映象,這個映象裡會包含編譯**所需的環境。下面來介紹下這個映象。

dockerfile

在和makefile相同的目錄下(原始碼的根目錄),有dockerfile。執行make build 相當於呼叫docker build,使用的就是該dockerfile。dockerfile中的幾個主要步驟(有些步驟這裡略過):

from ubuntu:14.04可以做code coverage test 、 go lint等**檢查

安裝registry和notary server;

安裝docker-py後面跑整合測試用的

將物理機的contrib/download-frozen-image.sh 指令碼拷貝到映象中/go/src/github.com/docker/docker/contrib/

執行contrib/download-frozen-image.sh 製作映象

:獲取token,後面curl獲取的其他資訊時都需要使用token。例如本例中 token='signature=9088f0552b1b147364e07bdd48857dd77c0d94ee,repository="library/busybox",access=read'

ancestryjson

$tree

發表於 2015-12-04 17:29|

蘑菇街|

蘑菇街牧白

雲計算docker

蘑菇街

摘要:本文根據docker官方給出的docker**編譯環境搭建指南做更深入的分析。官方給出的指導比較簡單,作者根據自身實踐經驗,總結了docker編譯的具體步驟和搭建心得。

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

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

make build時會呼叫 docker build -t "$(docker_image)" . 去製作乙個叫做docker_image的映象。

進行原始碼編譯的方式是執行 make binary來編譯**,在makefile中make binary的分支如下:

make binary除了進行 make build以外,會執行$(docker_run_docker),即上文提到的docker run命令列。由於執行過了build,會build出來docker-dev映象,所以在docker run時直接使用前面build出來的映象。docker run時的命令列引數是hack/make.sh binary。make binary的過程實際上是建立乙個容器,在容器中執行hack/make.sh binary指令碼。接下來會詳細介紹make build和make binary所做的內容。

根據官方的指導,先執行make build來搭建編譯環境。上面分析了,make build實際上是製作了乙個映象,這個映象裡會包含編譯**所需的環境。下面來介紹下這個映象。

最終在執行make build後,會製作出乙個叫docker-dev的映象。

執行make binary 就可以編譯出docker二進位制檔案。編譯出來的二進位制檔案在原始碼目錄下的bundles/1.10.0-dev/binary/docker-1.10.0-dev ,其中還包含md5和sha256檔案。

上一節提到的make binary中建立的容器啟動命令是hack/make.sh binary,執行容器中的(docker原始碼目錄下的)hack/make.sh指令碼,引數為binary。

make.sh中根據傳入的引數組裝後續編譯用的flags(buildflags),最後根據傳入的引數依次呼叫 hack/make/目錄下對應的指令碼。例如我們的操作中傳入的引數只有乙個binary。那麼在make.sh的最後,會呼叫hack/make/binary指令碼。

hack/make/binary指令碼中,就是直接呼叫go build進行編譯了,其中會使用buildflags ldflags ldflags_static_docker等編譯選項。

如果最終生成的docker二進位制檔案不在bundles/1.10.0-dev/binary/目錄下,那麼可能是編譯引數binddir設定的不正確,可以在執行make binary時增加binddir引數,例如

make binddir=. binary , 將binddir設定為當前目錄。

Docker 1 9 1 原始碼編譯

一 系統環境 ubuntu14.04 desktop 64位 二 安裝docker docker內編譯docker sudo apt get update sudo apt get install wget wget qo sh 三 拉取docker開發環境容器 docker pull docker...

Docker原始碼分析

docker原始碼分析 一 docker架構 docker原始碼分析 二 docker client建立與命令執行 docker原始碼分析 三 docker daemon啟動 docker原始碼分析 四 docker daemon之newdaemon實現 docker原始碼分析 五 docker s...

Docker原始碼分析

docker原始碼 docker原始碼分析 一 docker架構 docker原始碼分析 二 docker client建立與命令執行 docker原始碼分析 三 docker daemon啟動 docker原始碼分析 四 docker daemon之newdaemon實現 docker原始碼分析 ...