跳至主要内容

4.15 .dockerignore

在建置映像檔時,可以注意到到其中一段紀錄:

=> [internal] load .dockerignore

每一次建置的過程中,其都會自動去讀取 .dockerignore 這個檔案,但在之前並沒有好好的介紹過。

其最主要的功能在於提前篩選掉不需要進入建置階段的檔案,例如常見的 README.md 或是一些開發環境的設定檔,對於建置階段以及運行容器沒有幫助的檔案,都應該放入 .dockerignore 內。

下面舉個簡單的例子,這是資料夾的結構。

.
├── main.js
├── Dockerfile
├── .dockerignore
├── README.md

接著在 .dockerignore 內寫入:

./README.md
./Dockerfile

下方是 Dockerfile 的內容:

FROM alpine:latest
WORKDIR /app
COPY . .
CMD ["ls"]

接著一樣,建置這個映像檔:

$ docker image build --tag ignore .
+] Building 2.1s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 94B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 1.5s
=> CACHED [1/3] FROM docker.io/library/alpine:late.. 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 58B 0.0s
=> [2/3] WORKDIR /app 0.1s
=> [3/3] COPY . . 0.1s
=> exporting to image 0.3s
=> => exporting layers 0.3s
=> => writing image sha256:ac7715c782f9dfcdd93c0dbc871ada.......... 0.0s
=> => naming to docker.io/library/ignore 0.0s

運行成容器看看輸出的結果是什麼?

$ docker container run ignore
main.js

可以注意到,我們使用了 COPY . . 的方式,也就是複製當前目錄內的所有資料進入到建置階段,但卻只有 main.js 被留下了,而 Dockerfile 以及 README.md 則都被篩選掉了。

這麼做的好處在哪呢?練習或範例中,我們都可以直接 COPY 我們需要的檔案進入建置階段就可以。

但在大型的專案下,會有很多不必要進入建置階段的檔案,例如:測試的檔案、開發環境快取的檔案都不需要進入正式環境的映像檔,而這時候我們靠著一個一個去 COPY 則太過浪費時間一方面又增加映像層。

所以使用 .dockerignore 則可以讓你放心的去使用 COPY . . 來提升 Dockerfile 撰寫的乾淨度、減少映像檔的容量、降低映像層的層數,讓您透過一個檔案去管理所有不需要進入建置階段的檔案。