Crescendo Lab 文件
正體中文
註冊開始用

從 Dockerfile 部署 App

從含 Dockerfile 的原始碼,部署一個持續執行的服務,例如 webhook、API 或給 agent 用的工具。

最後更新

事前準備#

  • 一個會回應 HTTP 請求的程式。
  • 專案最上層有 Dockerfile。

1. 寫 Dockerfile#

以下是 Node.js 的例子。伺服器監聽 $PORT,映像檔只 EXPOSE 一個通訊埠,並用非 root 的使用者執行:

Dockerfile
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 8080
CMD ["node", "server.js"]
server.js
import { createServer } from "node:http";

const port = Number(process.env.PORT ?? 8080);

createServer((req, res) => {
  res.writeHead(200, { "content-type": "application/json" });
  res.end(JSON.stringify({ ok: true, path: req.url }));
}).listen(port);

映像檔要符合這幾點,完整規則見容器執行合約:

  • 有 CMD 或 ENTRYPOINT 啟動伺服器。
  • 在 $PORT 提供 HTTP。
  • 為 linux/amd64 建置。
  • 除了 /tmp,檔案系統是唯讀的。

2. 上傳原始碼#

在 App 的「部署」分頁,把原始碼資料夾或它的 .zip 拖進上傳區,再按「上傳並建置」。Dockerfile 要在最上層。自己壓 zip 時,記得排除 node_modules、.git 和 .env:

bash
zip -r ../app.zip . -x 'node_modules/*' '.git/*' '.env*'

平台會建置映像檔,掃描漏洞與密鑰,並檢查映像檔是否符合執行合約。平台幫你調整過的地方會以提示列在版本頁,例如「映像檔以 root 執行,改用 uid 10001 執行」。

已經有映像檔了?

推送到組織的映像檔登錄檔之後,在「部署新版本的來源」選「從映像檔」,就能直接用它建立新版本。

3. 上線並確認執行狀態#

App 的第一個版本建置成功後會自動上線,之後的版本要到「部署」分頁按「上線」。

「執行」分頁會顯示正在服務的版本,以及有幾個執行個體已經就緒。

版本一直沒有就緒

最常見的原因是通訊埠:伺服器沒有監聽平台給的通訊埠。處理方式見部署失敗排除。

4. 加入密鑰#

API 金鑰這類機密值,在 App 的「設定」輸入,程式從環境變數讀取。存檔後要重新啟動服務才會套用,重新啟動時舊的執行個體會繼續服務,直到新的就緒。詳見 App 設定。

不要把密鑰放進原始碼

掃描找到映像檔裡有密鑰時,請把它從原始碼拿掉、改成 App 的密鑰,並且換一把新的金鑰。