66 lines
4.4 KiB
Docker
66 lines
4.4 KiB
Docker
# =============================================================================
|
||
# 用途:本 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:23:42
|
||
# =============================================================================
|
||
|
||
# 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"]
|