# =============================================================================
# 用途：本 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"]
