docker 映象構建上下文理解

2022-03-21 14:49:56 字數 1937 閱讀 6854

原文 寫得賊好,特別鳴謝,哈哈

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

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

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

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

如果在 dockerfile 中這麼寫:

這並不是要複製執行 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映象構建上下文(Context)

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

012 docker的構建上下文

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

程序上下文與中斷上下文的理解

一.什麼是核心態和使用者態 使用者態 使用者程式執行空間。1.程序上下文 1 程序上文 其是指程序由使用者態切換到核心態是需要儲存使用者態時cpu暫存器中的值,程序狀態以及堆疊上的內容,即儲存當前程序的程序上下文,以便再次執行該程序時,能夠恢復切換時的狀態,繼續執行。2 程序下文 其是指切換到核心態...