Dockerfile 指令
每個指令的用意與 copy-exact 範例。以 Docker 官方 Dockerfile 參考為準(截至 2026-06)。
指令一覽
| 指令 | 用意 |
|---|---|
FROM | 指定基底映像,必須是第一條有效指令;AS <name> 替 stage 命名 |
RUN | build 期間執行指令(裝套件、編譯)。每條 RUN 是一層 |
CMD | 容器啟動時的預設指令,可被 docker run 後接的指令覆蓋 |
ENTRYPOINT | 容器啟動時固定執行的進入點,docker run 的參數不覆蓋它 |
COPY | 把 context 的檔案複製進映像(最常用) |
ADD | 同 COPY,但多了自動解壓 tar 與下載 URL(一般優先 COPY) |
ENV | 設環境變數,留在映像、容器執行時可見 |
ARG | build 期變數,--build-arg 傳入,不留在映像 |
WORKDIR | 設工作目錄(不存在會自動建),取代 RUN cd |
EXPOSE | 文件性質宣告監聽埠,不會真的開埠 |
VOLUME | 標記某路徑為外部 volume 掛載點 |
USER | 設後續指令與容器的執行身分(建議切非 root) |
LABEL | 加中繼資料(取代已棄用的 MAINTAINER) |
HEALTHCHECK | 定義健康檢查指令 |
ONBUILD | 延遲觸發:本映像被當基底時才執行 |
SHELL | 覆蓋 shell form 用的 shell |
STOPSIGNAL | docker stop 時送的信號(預設 SIGTERM) |
RUN 的 shell form 與 exec form
RUN 成一條(用 && 與 \)可減少層數,並把 apt 快取在同一層清掉。
三組常混的差異
- CMD vs ENTRYPOINT
- COPY vs ADD
- ARG vs ENV
CMD是「預設指令」,docker run myimg 其他指令會整個覆蓋 CMD。ENTRYPOINT是「固定進入點」,docker run後接的參數會附加在 ENTRYPOINT 之後,不覆蓋它。- 常見組合:
ENTRYPOINT放固定執行檔、CMD放可被覆蓋的預設參數。 - 兩者都用 exec form(JSON 陣列),PID 1 才是應用程式本身,才能正確收到 SIGTERM 做優雅關閉;shell form 會包一層
/bin/sh -c,signal 傳不進去。
| ENTRYPOINT 無 | ENTRYPOINT ["ep"](exec) | ENTRYPOINT ep(shell) | |
|---|---|---|---|
| CMD 無 | 錯誤 | ep | /bin/sh -c ep |
CMD ["cmd"] | cmd | ep cmd | /bin/sh -c ep(CMD 被忽略) |
CMD cmd | /bin/sh -c cmd | ep /bin/sh -c cmd | /bin/sh -c ep(CMD 被忽略) |
其他常用指令範例
EXPOSE 只是宣告,不會真的開埠;USER 不存在的使用者要先 RUN useradd 建立。
接下來
- 配合 Python 程式:把這些指令兜成可用的 Dockerfile。
- Layer cache 與最佳實踐:指令順序與快取。