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 開始執行全域性 在呼叫函式...