Docker映象構建上下文(Context)

2021-08-19 21:13:35 字數 2101 閱讀 8529

dicker在構建映象時,如果注意,會看到docker build命令最後有乙個..表示當前目錄,而dockerfile就在當前目錄,因此不少初學者以為這個路徑是在指定dockerfile所在路徑,這麼理解其實是不準確的。如果對應上面的命令格式,你可能會發現,這是在指定上下文路徑。那麼什麼是上下文呢?

首先我們要理解docker build的工作原理。docker 在執行時分為 docker 引擎(也就是服務端守護程序)和客戶端工具。docker 的引擎提供了一組 rest api,被稱為 docker remote api,而如docker命令這樣的客戶端工具,則是通過這組 api 與 docker 引擎互動,從而完成各種功能。因此,雖然表面上我們好像是在本機執行各種docker功能,但實際上,一切都是使用的遠端呼叫形式在服務端(docker 引擎)完成。也因為這種 c/s 設計,讓我們操作遠端伺服器的 docker 引擎變得輕而易舉。

當我們進行映象構建的時候,並非所有定製都會通過run指令完成,經常會需要將一些本地檔案複製進映象,比如通過copy指令、add指令等。而docker build命令構建映象,其實並非在本地構建,而是在服務端,也就是 docker 引擎中構建的。那麼在這種客戶端/服務端的架構中,如何才能讓服務端獲得本地檔案呢?

這就引入了上下文的概念。當構建的時候,使用者會指定構建映象上下文的路徑,docker build命令得知這個路徑後,會將路徑下的所有內容打包,然後上傳給 docker 引擎。這樣 docker 引擎收到這個上下文包後,展開就會獲得構建映象所需的一切檔案。

如果在dockerfile中這麼寫:

copy

這並不是要複製執行docker build命令所在的目錄下的package.json,也不是複製dockerfile所在目錄下的package.json,而是複製 上下文(context) 目錄下的package.json

現在就可以理解剛才的命令docker build -t nginx:v3 .中的這個.,實際上是在指定上下文的目錄,docker build命令會將該目錄下的內容打包交給 docker 引擎以幫助構建映象。

如果觀察docker build輸出,我們其實已經看到了這個傳送上下文的過程:

$ docker build -t nginx:v3 .

sending build context to docker daemon 2.048 kb

...

一般來說,應該會將dockerfile置於乙個空目錄下,或者專案根目錄下。如果該目錄下沒有所需檔案,那麼應該把所需檔案複製乙份過來。如果目錄下有些東西確實不希望構建時傳給 docker 引擎,那麼可以用.gitignore一樣的語法寫乙個.dockerignore,該檔案是用於剔除不需要作為上下文傳遞給 docker 引擎的。

那麼為什麼會有人誤以為.是指定dockerfile所在目錄呢?這是因為在預設情況下,如果不額外指定dockerfile的話,會將上下文目錄下的名為dockerfile的檔案作為 dockerfile。

這只是預設行為,實際上dockerfile的檔名並不要求必須為dockerfile,而且並不要求必須位於上下文目錄中,比如可以用-f ../dockerfile.php引數指定某個檔案作為dockerfile

當然,一般大家習慣性的會使用預設的檔名dockerfile,以及會將其置於映象構建上下文目錄中。

docker 映象構建上下文理解

原文 寫得賊好,特別鳴謝,哈哈 如果注意,會看到 docker build 命令最後有乙個.表示當前目錄,而 dockerfile就在當前目錄,因此不少初學者以為這個路徑是在指定 dockerfile 所在路徑,這麼理解其實是不準確的。如果對應上面的命令格式,你可能會發現,這是在指定上下文路徑。那麼...

012 docker的構建上下文

構建上下文 dockerfile 所在的目錄就是構建上下文 build context 構建映象時,docker會將構建上下文和該上下文中的檔案 目錄上傳到docker守護程序,這樣docker守護程序就可以直接訪問使用者想在映象中儲存的任何 檔案或者其他資料。如果在構建上下文的根目錄下存在以.do...

上下文 上下文棧

全域性 函式 區域性 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 this 賦值 window 開始執行全域性 在呼叫函式...