# syntax=docker/dockerfile:1 # ============================================================================ # 用途:建置「Calculate Next Version」Gitea/GitHub Docker action 的執行映像; # 採兩階段建置(build 整理產物、runtime 以 slim 基底縮小映像), # runtime 額外安裝 git 供主程式讀取 repo tag,最終以 entrypoint.sh 啟動 node 主程式。 # 更新時間:2026/07/16 09:16:51 # ============================================================================ # 1. 參數處理:node 版本以 ARG 注入(預設最新版;--node-version 可覆寫) # 置於第一個 FROM 之前的全域 ARG,兩個 FROM 皆可引用; # NODE_VERSION 決定 build 階段基底、NODE_RUNTIME 決定 runtime 階段基底。 # 需人工確認:latest / slim 皆為浮動 tag,未鎖定版本,重建結果可能隨上游更新而改變(不可重現建置)。 ARG NODE_VERSION=latest # runtime 基底 tag(slim 變體,體積較小);同屬全域 ARG,供第二個 FROM 引用。 ARG NODE_RUNTIME=slim # ---- build 階段:整理產物 ---- # 以完整版 node 映像作為 build 階段基底,僅用來集中整理 action 產物, # 不會進入最終映像,因此體積不影響結果。 FROM node:${NODE_VERSION} AS build # 設定工作目錄為 /action,後續 COPY/RUN 皆以此為基準路徑。 WORKDIR /action # 2. 安裝套件:無外部相依,僅使用 node 內建模組,故無 npm install # 3. 複製檔案:帶入主程式與入口 # 複製 src/(index.js / logger.js / version.js 等主程式模組)到 /action/src/。 COPY src/ /action/src/ # 複製容器入口腳本,負責輸出啟動訊息並以 exec 啟動 node 主程式。 COPY entrypoint.sh /action/entrypoint.sh # 4. 執行程序:賦予 entrypoint 執行權限 # 確保 entrypoint.sh 可被容器直接執行(避免來源檔案系統權限遺失時 ENTRYPOINT 失敗)。 RUN chmod +x /action/entrypoint.sh # 5. 縮小映像檔:runtime 改用 slim 基底,只帶必要產物;主程式需呼叫 git 讀 tag # 第二階段為最終映像,捨棄 build 階段中不必要的內容以縮小體積。 FROM node:${NODE_RUNTIME} AS runtime # 安裝 git(slim 基底未內建),主程式需以 git 指令讀取 repo 的 tag 計算版號; # --no-install-recommends 避免拉入非必要套件,安裝後清除 apt 快取以縮小 layer。 RUN apt-get update \ && apt-get install -y --no-install-recommends git \ && rm -rf /var/lib/apt/lists/* # 設定最終映像的工作目錄為 /action。 WORKDIR /action # 自 build 階段複製整理好的產物(src/ 與 entrypoint.sh)到最終映像。 COPY --from=build /action /action # 6. 設定入口:以 entrypoint.sh 啟動 node 主程式 # 使用 exec 形式的 ENTRYPOINT;entrypoint.sh 內以 exec node 取代 shell, # 正確傳遞訊號與 exit code;與 action.yml 的 entrypoint 設定一致。 ENTRYPOINT ["/action/entrypoint.sh"]