diff --git a/Dockerfile b/Dockerfile index 688c544..739fbfa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,65 +1,40 @@ # ============================================================================= -# 用途:本 Dockerfile 採「多階段建置(multi-stage build)」產出 codex CLI 映像。 -# build 階段使用 node-slim 基底,透過 npm 全域安裝 @openai/codex CLI 套件; -# runtime 階段同樣改用較小的 node-slim 基底,只帶入 build 階段安裝好的 codex -# 套件與其相依,並額外安裝 ca-certificates 以支援 HTTPS 連線, +# 用途:本 Dockerfile 採「單階段建置(single-stage build)」產出 codex CLI 映像。 +# 以 node-slim 為基底,透過 npm 全域安裝 @openai/codex CLI 套件, +# 並額外安裝 ca-certificates 以支援 HTTPS 連線, # 最終映像預設執行 `codex --version`。 -# 更新日期:2026/06/30 12:23:42 +# 更新日期:2026/07/01 09:58:04 # ============================================================================= # 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 +# 1. 參數處理:映像檔版本與套件版本皆直接寫死,無可調參數需以 ARG 注入(略) -# ---- build 階段:安裝 codex CLI 套件 ---- -# FROM ... AS build:以 BUILD_IMAGE 為基底開啟名為 build 的第一個建置階段(供後續 COPY --from 取用產物) -FROM ${BUILD_IMAGE} AS build +# ---- 單一建置階段:安裝 codex CLI 套件 ---- +# FROM node:22-slim:以 node 22 slim 版為基底開啟唯一建置階段(slim 版較精簡) +FROM node:22-slim -# 2. 安裝套件:以 npm 全域安裝 codex CLI(無本地相依描述檔,故無 manifest 先行 COPY 的 layer 快取最佳化空間) +# ENV DEBIAN_FRONTEND=noninteractive:設定 Debian 套件管理為非互動模式,避免 apt 安裝時跳出互動提示而卡住建置 +ENV DEBIAN_FRONTEND=noninteractive + +# 2. 安裝套件:先以 apt 安裝 codex 進行 HTTPS 連線所需的 ca-certificates,再以 npm 全域安裝 @openai/codex CLI # 官方 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 +# (單階段無跨階段 COPY,npm 建立的 /usr/local/bin/codex symlink 原地保留、指向正確,可正常解析平台原生相依) +# RUN:apt 安裝 ca-certificates(--no-install-recommends 不裝建議套件)→ npm 全域安裝 codex → +# 於同一層合併清理 apt 索引快取與 npm 快取,避免快取檔殘留而膨脹該層 +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + && npm install -g @openai/codex \ + && npm cache clean --force \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* # 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 - +# 5. 縮小映像檔:單階段下透過「slim 基底 + --no-install-recommends + 安裝與清理合併於同層(見步驟 2)」達成縮小,故此處無獨立清理指令 # 6. 設定入口:CMD 置於最後,語意與原檔一致 # CMD:容器啟動時的預設執行指令,預設執行 `codex --version` 顯示版本(exec form,不經 shell);可於 docker run 時覆寫 CMD ["codex", "--version"]