部署部署方式Dockerfile 部署

Dockerfile 部署

正常情況下你無需自行撰寫 Dockerfile,Zeabur 目前已針對各種主流框架提供了快速部署的方式,但如果你的專案不是使用這些框架,或是你想要自行定義部署的方式,你可以使用 Dockerfile 來部署。

建立 Dockerfile

在你的專案根目錄建立一個名為 Dockerfiledockerfile 的檔案,並且在裡面撰寫你的部署方式,最後須確保你有暴露對應的 PORT

Zeabur 會自動偵測你的專案是否有 Dockerfile,如果有的話會以 docker 的方式來部署你的專案。

開始部署後即可在上方看到 docker 的圖示,代表你的專案已經以 docker 的方式來部署。

docker-deploy

不使用 Dockerfile 部署

如果你的專案有 Dockerfile,但你不希望在 Zeabur 上使用這個 Dockerfile(例如想由 Zeabur 決定專案最佳的部署方式),你可以在環境變數中設定 ZBPACK_IGNORE_DOCKERFILE=true,或在 zbpack.json 裡面加入:

{
  "ignore_dockerfile": true
}

Zeabur 就會忽略你的 Dockerfile,而由 Zeabur 自動決定部署方式。

環境變數

如果你的 Dockerfile 需要使用到環境變數,你可以在該服務的頁面點選 環境變數 來新增,更多的設定方式請參考 環境變數

環境變數設定

如果你的 Dockerfile 撰寫方式為一個階段 (stage),或是你的環境變數只需在最後一個階段中使用,很好的你無需手動寫 ENV,Zeabur 會自動幫你加上。

ARG

但如果你的 Dockerfile 撰寫方式為多個階段 (multi-stage),並且需要在建置前就設定環境變數,你可以使用 ARG 來設定。

以下我們以 nodejs 及 nginx 為例,撰寫一個 Dockerfile 來部署。

FROM node:18-alpine AS builder
 
WORKDIR /app
COPY . .
 
## 這裡的 `BUILDTIME_ENV_EXAMPLE` 會自動在建置前被設定
ARG BUILDTIME_ENV_EXAMPLE
ENV BUILDTIME_ENV_EXAMPLE=${BUILDTIME_ENV_EXAMPLE}
 
RUN npm install && \
    npm run build
 
FROM nginx:alpine
 
COPY nginx.conf /etc/nginx/conf.d/configfile.template
COPY --from=builder /app/dist /usr/share/nginx/html
 
ENV \
    PORT=8080 \
    HOST=0.0.0.0
 
EXPOSE 8080
 
CMD sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

指定要部署的 Dockerfile(單一 repo 多服務 / monorepo)

當你的 repo 有多個 Dockerfile(例如 monorepo 結構,一個倉庫部署多個服務),Zeabur 提供三種方式來指定每個服務要用哪個 Dockerfile。

方法一:用服務名稱自動配對(推薦)

最簡單的方式:把 Dockerfile 命名為 [服務名稱].DockerfileDockerfile.[服務名稱],Zeabur 會根據你在 dashboard 上設定的服務名稱自動配對。例如,服務名稱是 storage,Zeabur 會自動使用 Dockerfile.storagestorage.Dockerfile

specify-service-name

方法二:用 ZBPACK_DOCKERFILE_NAME 指定後綴

若 Dockerfile 已命名為 <suffix>.DockerfileDockerfile.<suffix>,但你不想讓服務名稱跟著走,可以用環境變數明確指定後綴:

ZBPACK_DOCKERFILE_NAME=storage

或在 zbpack.json 中:

{
  "dockerfile": {
    "name": "storage"
  }
}

Zeabur 會找 Dockerfile.storagestorage.Dockerfile

⚠️

這個變數只接受後綴,不要填完整檔名。如果你設成 ZBPACK_DOCKERFILE_NAME=Dockerfile.storage,Zeabur 會去找名為 Dockerfile.Dockerfile.storage 的檔案,找不到就會退回自動偵測(通常會誤判成 Node.js 等其他 builder)。如果你想填完整路徑或檔名,請改用下面的 ZBPACK_DOCKERFILE_PATH

方法三:用 ZBPACK_DOCKERFILE_PATH 指定任意路徑

若 Dockerfile 不在建置根目錄、或檔名不符合 *.Dockerfile / Dockerfile.* 慣例,可以用這個變數指定 Dockerfile 的路徑。路徑是相對於該服務的「建置根目錄」——若服務有設定 Root Directory,則相對於該目錄,否則相對於 repo 根目錄:

ZBPACK_DOCKERFILE_PATH=apps/admin/Dockerfile

或在 zbpack.json 中:

{
  "dockerfile": {
    "path": "apps/admin/Dockerfile"
  }
}

Zeabur 會直接使用該路徑下的檔案來建置,不再做後綴比對。這是你想指定子目錄裡的 Dockerfile、或檔名完全自訂時應該用的變數。

Docker Compose

Zeabur 目前還不支援從 Docker Compose YAML 進行部署。

您可以將 Docker Compose 檔案轉換成 Zeabur Template YAML,可以參考〈從 YAML 建立模板〉一文。如果需要協助,也可以在 社群 詢問我們。