Files
codex/Dockerfile
T

66 lines
4.4 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 用途:本 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_VERSIONnode 基底映像的版本號,預設 22,可於 build 時以 --build-arg 覆寫
ARG NODE_VERSION=22
# ARG BUILD_IMAGEbuild 階段的基底映像,預設為 node:<版本>-slimslim 版較精簡)
ARG BUILD_IMAGE=node:${NODE_VERSION}-slim
# ARG RUNTIME_IMAGEruntime 階段的基底映像,預設同樣為 node:<版本>-slim
ARG RUNTIME_IMAGE=node:${NODE_VERSION}-slim
# ARG CODEX_PACKAGE:要全域安裝的 npm 套件名稱,預設 @openai/codexcodex 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_modulesbin 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"]