從 Dockerfile 部署 App
從含 Dockerfile 的原始碼,部署一個持續執行的服務,例如 webhook、API 或給 agent 用的工具。
事前準備#
- 一個會回應 HTTP 請求的程式。
- 專案最上層有
Dockerfile。
1. 寫 Dockerfile#
以下是 Node.js 的例子。伺服器監聽 $PORT,映像檔只 EXPOSE 一個通訊埠,並用非 root 的使用者執行:
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 8080
CMD ["node", "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:
zip -r ../app.zip . -x 'node_modules/*' '.git/*' '.env*'平台會建置映像檔,掃描漏洞與密鑰,並檢查映像檔是否符合執行合約。平台幫你調整過的地方會以提示列在版本頁,例如「映像檔以 root 執行,改用 uid 10001 執行」。
已經有映像檔了?
推送到組織的映像檔登錄檔之後,在「部署新版本的來源」選「從映像檔」,就能直接用它建立新版本。
3. 上線並確認執行狀態#
App 的第一個版本建置成功後會自動上線,之後的版本要到「部署」分頁按「上線」。
「執行」分頁會顯示正在服務的版本,以及有幾個執行個體已經就緒。
版本一直沒有就緒
最常見的原因是通訊埠:伺服器沒有監聽平台給的通訊埠。處理方式見部署失敗排除。
4. 加入密鑰#
API 金鑰這類機密值,在 App 的「設定」輸入,程式從環境變數讀取。存檔後要重新啟動服務才會套用,重新啟動時舊的執行個體會繼續服務,直到新的就緒。詳見 App 設定。
不要把密鑰放進原始碼
掃描找到映像檔裡有密鑰時,請把它從原始碼拿掉、改成 App 的密鑰,並且換一把新的金鑰。