# ============================================================================= # 用途:本 Dockerfile 採「多階段建置(multi-stage build)」產出 codex CLI 映像。 # build 階段使用 node-slim 基底,透過 npm 全域安裝 @openai/codex CLI 套件; # runtime 階段同樣改用較小的 node-slim 基底,只帶入 build 階段安裝好的 codex # 套件與其相依,並額外安裝 ca-certificates 以支援 HTTPS 連線, # 最終映像預設執行 `codex --version`。 # 更新日期:2026/06/30 12:00:12 # ============================================================================= # syntax 指示詞:指定使用 dockerfile:1 前端語法,啟用 BuildKit 進階功能(必須置於檔首第一行有效指令) # syntax=docker/dockerfile:1 # 1. 參數處理:可調參數集中於檔首,以 ARG 注入 # ARG NODE_VERSION:node 基底映像的版本號,預設 22,可於 build 時以 --build-arg 覆寫 ARG NODE_VERSION=22 # ARG BUILD_IMAGE:build 階段的基底映像,預設為 node:<版本>-slim(slim 版較精簡) ARG BUILD_IMAGE=node:${NODE_VERSION}-slim # ARG RUNTIME_IMAGE:runtime 階段的基底映像,預設同樣為 node:<版本>-slim ARG RUNTIME_IMAGE=node:${NODE_VERSION}-slim # ARG CODEX_PACKAGE:要全域安裝的 npm 套件名稱,預設 @openai/codex(codex CLI) ARG CODEX_PACKAGE=@openai/codex # ---- build 階段:安裝 codex CLI 套件 ---- # FROM ... AS build:以 BUILD_IMAGE 為基底開啟名為 build 的第一個建置階段(供後續 COPY --from 取用產物) FROM ${BUILD_IMAGE} AS build # 2. 安裝套件:以 npm 全域安裝 codex CLI(無本地相依描述檔,故無 manifest 先行 COPY 的 layer 快取最佳化空間) # 官方 node image 的全域安裝前綴為 /usr/local,套件與其相依落於 /usr/local/lib/node_modules,bin symlink 落於 /usr/local/bin # ARG CODEX_PACKAGE:在 build 階段內重新宣告 ARG,使檔首定義的值可在此階段被引用(ARG 作用域以 FROM 為界,跨階段需重新宣告) ARG CODEX_PACKAGE # RUN npm install -g:全域安裝指定的 codex 套件;接著 npm cache clean --force 清除 npm 快取, # 避免快取檔殘留於此層(雖然 build 階段產物不會整層帶入 runtime,仍維持乾淨並縮小該層) RUN npm install -g "${CODEX_PACKAGE}" \ && npm cache clean --force # 3. 複製檔案:本映像為純 CLI 工具安裝,無專案原始碼需複製(略) # 4. 執行程序:codex 為預編譯 npm 套件,無 build / compile / transpile 步驟(略) # ---- 5. 縮小映像檔:runtime 改用較小的 node-slim 基底,只帶執行所需產物 ---- # FROM ... AS runtime:以 RUNTIME_IMAGE 為基底開啟名為 runtime 的最終階段; # 此階段為最終輸出映像,不含 build 階段的 npm 快取等中間產物,藉此縮小映像體積 FROM ${RUNTIME_IMAGE} AS runtime # 保留原檔的 ENV 契約:DEBIAN_FRONTEND=noninteractive(並使下方 apt 安裝為非互動) # ENV DEBIAN_FRONTEND=noninteractive:設定 Debian 套件管理為非互動模式,避免 apt 安裝時跳出互動提示而卡住建置 ENV DEBIAN_FRONTEND=noninteractive # 保留原檔行為:安裝 ca-certificates 供 codex 進行 HTTPS 連線,安裝後清理 apt 快取縮小該層 # RUN apt-get:更新套件索引後,以 --no-install-recommends 僅安裝 ca-certificates(不裝建議套件,減少體積); # 安裝完成後 apt-get clean 並刪除 /var/lib/apt/lists/* 套件索引快取,將清理與安裝合併於同一層以縮小該層 RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 只帶入執行所需產物:全域安裝的 codex 套件(含其相依)與 bin symlink # COPY --from=build node_modules:自 build 階段複製全域套件目錄(codex 套件本體與其所有相依) COPY --from=build /usr/local/lib/node_modules /usr/local/lib/node_modules # COPY --from=build codex:自 build 階段複製 codex 的可執行檔(bin symlink),使其可於 PATH 中直接呼叫 COPY --from=build /usr/local/bin/codex /usr/local/bin/codex # 6. 設定入口:CMD 置於最後,語意與原檔一致 # CMD:容器啟動時的預設執行指令,預設執行 `codex --version` 顯示版本(exec form,不經 shell);可於 docker run 時覆寫 CMD ["codex", "--version"]