Docker - build 命令後點號 & .dockerignore 文件

docker build 命令後"."

我們在使用 docker build 命令去構建鏡像時,往往會看到命令最後會有一個 . 號。

docker build -t xxxxx .

那麼這裏的 . 號代表什麼意思呢?

在我們學習對 . 號的理解有所偏差,以爲是用來指定 Dockerfile 文件所在的位置的,但其實 -f 參數纔是用來指定 Dockerfile 的路徑的,那麼 . 號究竟是用來做什麼的呢?

Docker 在運行時分爲 Docker引擎(服務端守護進程) 以及 客戶端工具,我們日常使用各種 docker 命令,其實就是在使用客戶端工具與 Docker 引擎 進行交互。

那麼當我們使用 docker build 命令來構建鏡像時,這個構建過程其實是在 Docker引擎 中完成的,而不是在本機環境。

那麼如果在 Dockerfile 中使用了一些 COPY 等指令來操作文件,如何讓 Docker引擎 獲取到這些文件呢?

這裏就有了一個 鏡像構建上下文 的概念,當構建的時候,由用戶指定構建鏡像的上下文路徑,而 docker build 會將這個路徑下所有的文件都打包上傳給 Docker 引擎,引擎內將這些內容展開後,就能獲取到所有指定上下文中的文件了。

比如說 dockerfile 中的 COPY ./package.json /project,其實拷貝的並不是本機目錄下的 package.json 文件,而是 docker引擎 中展開的構建上下文中的文件,所以如果拷貝的文件超出了構建上下文的範圍,Docker引擎 是找不到那些文件的。

所以 docker build 最後的 . 號,其實是在指定鏡像構建過程中的上下文環境的目錄。

理解了上面的這些概念,就更方便的去理解 .dockerignore 文件的作用了。

 

.dockerignore 文件作用

那麼 .dockerignore 文件是起什麼作用的呢?

不管是在 docker build 過程中,還是 docker run 的過程中,有沒有這個文件好像並沒有什麼很大的影響,存在感不強的一個文件。

首先需要理解一下鏡像構建上下文(context) 的概念,參見另一篇博文:

docker build 命令後 . 號的意思

理解了這個概念就明白,當我們在 docker build 的過程中,首先會將指定的上下文目錄打包傳遞給 docker引擎,而這個上下文目錄中可能並不是所有的文件我們都會在 Dockerfile 中使用到,那麼這個時候就可以在 .dockerignore 文件中指定在傳遞給 docker引擎 時需要忽略掉的文件或文件夾。

舉慄說明~

比如我們在前端項目中,node_modules 文件夾在構建鏡像過程中如果用不到,但是又異常龐大,那麼向 docker引擎 傳遞其實是並沒有必要的(其實大家電腦性能都這麼好,也不在乎這幾秒鐘了。。。只是舉個例子,可以提升鏡像構建速度),這個時候就可以將 node_modules 文件夾加入 .dockerignore 文件中。

如下所示,速度提升還是很明顯的。

  • 加入前

  • 加入後
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章