.dockerignore


 

刪除git 緩存
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

 

  

.dockerignore 文件從入門到實踐

.dockerignore 文件的作用類似於 git 工程中的 .gitignore 。不同的是 .dockerignore 應用於 docker 鏡像的構建,它存在於 docker 構建上下文的根目錄,

用來排除不需要上傳到 docker 服務端的文件或目錄。

docker 在構建鏡像時首先從構建上下文找有沒有 .dockerignore 文件,如果有的話則在上傳上下文到 docker 服務端時忽略掉 .dockerignore 里面的文件列表。

 

好處是:

  • 構建鏡像時能避免不需要的大文件上傳到服務端,從而拖慢構建的速度、網絡帶寬的消耗;
  • 可以避免構建鏡像時將一些敏感文件及其他不需要的文件打包到鏡像中,從而提高鏡像的安全性;

 

.dockerignore 文件編寫方法

.dockerignore 文件的寫法和 .gitignore 類似,支持正則和通配符,具體規則如下:

  • 每行為一個條目;
  • 以 # 開頭的行為注釋;
  • 空行被忽略;
  • 構建上下文路徑為所有文件的根路徑;

 

文件匹配規則具體語法如下:

 

 

 

⚠️注意事項:
如果兩個匹配語法規則有包含或者重疊關系,那么以后面的匹配規則為准,比如:

*.md
!README*.md
README-secret.md

將根路徑下所有以 .md 結尾的文件排除,以 README 開頭 .md 結尾的文件保留,但是 README-secret.md 文件排除。

 

*.md
README-secret.md
!README*.md

將根路徑下所有以 .md 結尾和名稱為 README-secret.md 的文件排除,但所有以 README 開頭 .md 結尾的文件保留。這樣的話 README-secret.md 依舊會被保留,並不會被排除,因為 README-secret.md 符合 !README*.md 規則。

使用案例
前段時間幫前端同學寫了一個 Dockerfile,Dockerfile 放在 git 倉庫根路徑下,發現 git 工程中有很多真正應用跑起來用不到的文件,如果直接在 Dockerfile 中使用 COPY 或 ADD 指令拷貝文件,那么很顯然會把很多不需要的文件拷貝到鏡像中,從而會拖慢構建鏡像的過程,產生的鏡像也比較臃腫

解決方法就是編寫 .dockerignore 文件,忽略掉不需要的文件,然后放到 docker 構建上下文的根路徑下。

.git
_mockData
deleted
email-templates
script
static

  

Dockerfile:

FROM node:8-alpine

COPY . /app/node
WORKDIR /app/node
RUN yarn install

EXPOSE 8026

CMD ["yarn", "run", "tool-dev"]

  

 

使用 .dockerignore 前后上傳到 docker 服務端的構建上下文大小對比:

使用前(73.36MB):

[vagrant@docker]$ docker build -t tool:5.0 -f Dockerfile-frontend-tool .
Sending build context to Docker daemon  73.36MB
Step 1/6 : FROM node:8-alpine

  

使用后(11.38MB):

[vagrant@docker]$ docker build -t tool:6.0 -f Dockerfile-frontend-tool .
Sending build context to Docker daemon  11.38MB
Step 1/6 : FROM node:8-alpine

  

參考資料

https://docs.docker.com/engine/reference/builder/#dockerignore-file

 

.dockerignore 文件的作用

 

類比

在項目中,我們見過很多各式各樣的 ignore 文件。

比如使用 .gitignore 來忽略掉你不想追蹤的文件:https://git-scm.com/docs/gitignore

使用 .npmignore 來忽略你在發布包時不想發布的文件:https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

那么 .dockerignore 文件是起什么作用的呢,不管是在 docker build 過程中,還是 docker run 的過程中,有沒有這個文件好像並有什么很大的影響,存在感不強的一個文件

 

首先需要理解一下 鏡像構建上下文(context) 的概念,參見另一篇博文:docker build 命令后 . 號的意思

理解了這個概念就明白,當我們在 docker build 的過程中,

首先會將指定的上下文目錄打包傳遞給 docker引擎,而這個上下文目錄中可能並不是所有的文件我們都會在 Dockerfile 中使用到,那么這個時候就可以在 .dockerignore 文件中指定在傳遞給 docker引擎 時需要忽略掉的文件或文件夾

 

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

 

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

 

 

 

 加入后:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM