---
title: 從 Dockerfile 部署 App
description: 從含 Dockerfile 的原始碼，部署一個持續執行的服務，例如 webhook、API 或給 agent 用的工具。
url: https://agentlab.cresclab.com/docs/zh-tw/deploy/container-app
language: zh-Hant-TW
updated: 2026-10-06
---

# 從 Dockerfile 部署 App

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

## 事前準備

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

## 1. 寫 Dockerfile

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

```dockerfile Dockerfile
FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 8080
CMD ["node", "server.js"]
```

```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);
```

映像檔要符合這幾點，完整規則見[容器執行合約](https://agentlab.cresclab.com/docs/zh-tw/deploy/runtime-contract.md)：

- 有 `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 執行」。

> [!NOTE] 已經有映像檔了？
> 推送到組織的映像檔登錄檔之後，在「部署新版本的來源」選「從映像檔」，就能直接用它建立新版本。

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

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

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

> [!WARNING] 版本一直沒有就緒
> 最常見的原因是通訊埠：伺服器沒有監聽平台給的通訊埠。處理方式見[部署失敗排除](https://agentlab.cresclab.com/docs/zh-tw/deploy/troubleshooting.md#not-ready)。

## 4. 加入密鑰

API 金鑰這類機密值，在 App 的「設定」輸入，程式從環境變數讀取。存檔後要重新啟動服務才會套用，重新啟動時舊的執行個體會繼續服務，直到新的就緒。詳見 [App 設定](https://agentlab.cresclab.com/docs/zh-tw/deploy/app-settings.md#secrets)。

> [!WARNING] 不要把密鑰放進原始碼
> 掃描找到映像檔裡有密鑰時，請把它從原始碼拿掉、改成 App 的密鑰，並且換一把新的金鑰。
