docker build 會將每個動作建立一個 image layer,好處就是相同的動作所建立 image layer 都可以重複使用,僅有新的動作會增加新的 image layer。
不過 chown 會讓 docker 將檔案判定為新的檔案,而另外新增一個 layer,導致 image size 增加。
以下是一個小實驗,其中 test.img
為 512MB 的檔案:
FROM ubuntu:20.04 # test:512-file COPY test.img /var/ # test:512-chown RUN chown www-data:www-data /var/test.img
然後針對第二、第三個指令分別 build -t
以後,透過 docker images
列出 images 和他的大小:
test 512-chown 02367f2a3158 4 seconds ago 1.15GB test 512-file 965cb380f042 41 seconds ago 610MB
經過 chown 的 test.img
被 docker 判斷為新的檔案,因此多了一個 image layer 來儲存異動,image 就整整多了 512MB,這對建立 docker image 來說儲存、傳輸成本會大很多。
目前看到比較好的解法,是使用 COPY --chown
直接指定檔案的 owner,這樣異動就會放在同一個 image layer。
先 touch & chmod,在 copy 覆蓋 touch 出來的檔案,說不定可以避開這個問題 (不確定)
測試了上面的方法,確定沒有用。
雖然先 chmod,但是在 COPY 檔案進去以後,權限就會被 COPY 進去的檔案覆蓋掉 ….