刪除git 緩存 git rm -r --cached . git add . git commit -m 'update .gitignore'
.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
類比
在項目中,我們見過很多各式各樣的 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 文件中。
如下所示,速度提升還是很明顯的。
加入前:
加入后: