From 4622ff3001c442f6959fa93006edbb3c1b223605 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Tue, 30 Jun 2026 12:13:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor(Dockerfile):=20=E9=87=8D=E6=95=B4?= =?UTF-8?q?=E7=82=BA=E5=A4=9A=E9=9A=8E=E6=AE=B5=E5=85=AD=E6=AD=A5=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=B8=A6=E6=94=B9=E7=94=A8=20node-slim=20=E5=9F=BA?= =?UTF-8?q?=E5=BA=95=E7=B8=AE=E5=B0=8F=E6=98=A0=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 66 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4c1f4ba..0f28e0d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,65 @@ -FROM ubuntu:latest +# ============================================================================= +# 用途:本 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 -RUN apt update \ - && apt install -y --no-install-recommends \ +# 保留原檔行為:安裝 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 \ - nodejs \ - npm \ - && npm install -g @openai/codex \ - && apt clean \ + && apt-get clean \ && rm -rf /var/lib/apt/lists/* -CMD ["codex", "--version"] +# 只帶入執行所需產物:全域安裝的 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"]