Skip to main content
Dockerfile layer cache 理解 layer cache 才知道為什麼 Dockerfile 的指令順序會影響 build 速度。

核心原則

  • 每條指令是一層,是 cache 的基本單位。Docker 比對指令字串與相關檔案的 checksum,完全相同才命中快取。
  • 失效會串聯:某一層 cache 失效,後面所有層一律重建,不管它們本身有沒有變。
各指令的失效條件:

指令排序最佳化

原則:變動頻率低的指令放前面,高的放後面。
RUN apt-get update 的雷:updateinstall 要寫在同一條 RUN,否則 update 那層被快取後,install 可能裝到舊版本:

強制跳過與清理

Cache mount(跨 build 持久化套件快取)

讓套件下載快取跨 build 持久化(不進映像層):
--mount=type=cache 的快取不進 image layer,只在 builder 端持久化,比傳統做法省 build 時間。

最佳實踐範本

把原則收成一份可直接抄的範本:
重點:合併 RUN 並清 apt 快取(rm -rf /var/lib/apt/lists/*)、pip install --no-cache-dir 不把 pip 快取留進映像、固定基底 tag、切非 root USER、用 .dockerignore 縮小 context、WORKDIR 用絕對路徑取代 RUN cd

注意事項與安全

  • 別用 latest:基底固定 major.minor(或更嚴格用 digest @sha256:...),避免基底悄悄換版本。
  • 切非 root USER:預設 root 跑容器風險高,建專用使用者再切過去。
  • 機密別進 DockerfileARG / ENV 會留在 docker history,密碼金鑰用執行期注入(docker run --env / Compose env_file / secrets),不要寫死在 Dockerfile。
  • ADD 下載 URL 要當心:快取與認證行為複雜,需要下載多用 RUN curl 並驗 checksum;一般複製優先 COPY

接下來

官方參考:docs.docker.com/build/cachebuild 最佳實踐