今天這篇文章是作者工作多年來,對於 Dockerfile 的一些想法與學習到的經驗,主要內容是講述到底如何最佳化 Dockerfile 的內容,實作上有哪些底可以參考與注意
1. 利用 Cache 的概念來加速建置的時間,最明顯的範例就是 RUN 這個指令,很常看到大家會透過一次 RUN 指令來安裝全部使用的套件,而非每個指令單獨一個 RUN,後者會產生眾多的的 Layer 數量
2. 沒有使用到的套件就不需要安裝,盡量保持精準原則,只安裝必要的相依性套件。這過這些階段可以節省一些 Image 大小,對於未來下載與部署都能夠有一些速度上的提升
3. 採用官方的 image 作為 base image,這部分的安全性會更佳保證,同時內容也會有專門團隊維護。此外 tag 部份也要注意不要使用 latest,最好能夠針對需求去固定版本,以免上游更新後,重新建置的 image 產生出不同的執行結果,這時候除錯也很麻煩
4. 採用 Multi-stage 的方式來建置你的環境,最常見的範例就是將編譯環境與執行環境分開。第一個 Stage 先準備建置環境,安裝相關的工具最後編譯出執行檔案,接者把該檔案複製到第二個 Stage 去單純執行即可
除了這些外,也有些滿常見的概念譬如,能的話盡量透過 USER 去指定使用者,而不是採用 root 的方式直接碾壓過去。
至於要不要使用 Alpine ,這部分見仁見智,畢竟 Alpine 某些版本會有些問題,特別是 Kubernetes 內可能會有 DNS 查詢的問題
我個人是非常討厭精簡化的容器,因為當發生問題想要進去看的時候,連一些工具都沒有,有的連 shell 都沒有,完全不給人除錯用
https://blog.bitsrc.io/best-practices-for-writing-a-dockerfile-68893706c3
Search