跳到內容
開源

匯入 Docker Compose 服務

讀取 Compose 與環境變數檔案,確認轉換差異後在專案建立服務。

在專案選擇 新增 → Docker Compose,貼上 compose.yaml,按 讀取檔案。逐一確認服務、資料庫替換與公開網域後,再 檢查變更 並套用。匯入後,每個服務都能分開編輯。Zeabur 不會保存或持續同步原本的 Compose 檔案。

  • 準備 Compose 檔案,以及它使用的 .env、env_file 內容。Compose 檔案上限為 256 KiB,包含 1 到 50 個服務。
  • 每個要部署的服務都有已推送到 registry 的 image。只有 build: 的服務不會建立,改走從 Git 部署或先推送映像檔。
  • 已有專案與建立服務的權限。匯入磁碟區、機密、網域或 operator 管理的資料庫,也要有各自的建立權限。
  • 若要把 PostgreSQL、MongoDB、MySQL、MariaDB、Redis/Valkey 或 MinIO 換成 operator 管理的服務,先安裝相應元件。

開啟 新增 → Docker Compose,在 Compose 檔案 貼上 YAML,或按 上傳檔案 選取檔案,接著按 讀取檔案。

如果檔案有 ${NAME} 等插值,但沒有對應的值,介面會要求 .env 內容。env_file 指向的檔案也會各自出現輸入欄位。貼上或上傳它們後,再按 讀取檔案。

缺少的插值會變成空字串,沒有提供的 env_file 變數會略過。先把這些值補齊,避免程式用空密碼或空位址啟動。同一個變數同時出現在 env_file 和 environment 時,使用 environment 的值。

叢集裝了對應的 operator、你也有建立權限時,這些服務的 建立由 operator 管理的…(後面接引擎名稱)預設開啟:

Compose 映像檔建立的服務
PostgreSQLCloudNativePG 管理的 PostgreSQL
MongoDBPercona Operator 管理的 MongoDB
MySQLMOCO 管理的 MySQL
MariaDBmariadb-operator 管理的 MariaDB
Redis、ValkeyDragonfly Operator 管理的 Dragonfly
MinIOSeaweedFS Operator 管理的物件儲存

開啟後,選項下方會逐項列出新服務和 Compose 服務不同的地方:版本、啟動指令、連接埠、磁碟區、帳號密碼變數與執行個體數。例如磁碟區那一行會寫出新磁碟區的大小,並提醒一開始是空的。

要繼續用原本的映像檔,就關閉這個選項。有兩個以上的服務可以替換時,上方的 N 個都換成 operator 管理的服務 一次開啟或關閉全部。缺少 operator、無法確認是否安裝,或權限不足時,該服務會直接執行原映像檔,介面會寫出原因。

選擇 operator 管理後,其他服務中可辨識的連線字串、主機、使用者、密碼與資料庫名稱會改寫成新服務的連線設定。無法改寫的參照會保留原值,並提示匯入後檢查。

Compose 的 ports 不會直接開放節點的主機連接埠。在需要對外提供 HTTP 的一般服務上,開啟 公開網域,確認建議的網域或自行填寫。

例如 "3000:3000" 會保留容器的 TCP 連接埠 3000,但不會把主機的 3000 對外開放。公開網域 預設關閉,DNS 與 HTTPS 仍要依公開網域設定。

閱讀每個服務下面的掛載路徑、等待對象與略過欄位,再按 檢查變更。確認服務數量、機密、磁碟區、資料庫與網域。

匯入的服務使用「相容」安全性,因為大多數 Compose 映像檔以 root 執行。

如果修改了 Compose 或變數檔案內容,要重新 讀取檔案 才能檢查新的結果。

原本的設定匯入後的行為與受影響情境
entrypoint、command一般映像檔服務會帶入容器指令與參數。換成 operator 管理的服務後,由 operator 啟動。例如 Redis 的 redis-server --appendonly yes 不會帶入 Dragonfly。
資料服務的 ports換成 operator 管理後,使用新服務的私有連線。MinIO 的 9000 與管理介面 9001 不會沿用,應用程式改連 SeaweedFS S3 端點。
命名磁碟區每個服務的每個掛載建立自己的 1 GiB 磁碟區,不搬移原資料。同名磁碟區由多服務共用的關係也會拆開。後續容量能否擴充,取決於儲存類別。
主機路徑、Docker socket不會掛載。原本靠主機目錄提供的設定檔或資料,要另放進磁碟區或設定檔。
depends_on啟動前等待相依服務的 TCP 連接埠可連線。沒有可辨識連接埠的相依服務不會加入等待。
healthcheck略過原檢查,改以第一個連接埠的 TCP 連線作為就緒檢查,匯入後可到 設定 調整。
UDP 連接埠略過。匯入建立的 Kubernetes Service 只有 TCP。
privileged、cap_add、devices、network_mode: host、pid: host略過。需要主機裝置或主機權限的應用程式,要先處理這些相依條件再部署。
build: 同時有 image直接下載 image,略過本機建置。
不符合名稱規則的服務名稱轉成小寫字母、數字與連字號。檢查仍保留舊名稱的應用程式設定。
一般服務的明文變數有建立機密權限時,存到 <服務名稱>-env 機密。例如改寫後的 S3_ENDPOINT 也可能出現在這裡。

回到專案,確認預期服務都出現。依序打開各服務的 概覽 與 日誌。資料庫與物件儲存剛建立時,要等 operator 建立執行個體與連線機密。

到應用程式的 環境變數 檢查匯入後的連線來源,再實際執行一次資料庫讀寫或檔案上傳。網頁能開啟後,也要確認它讀到的是搬移後的資料。

用 kubectl 確認時,一般服務的物件帶有 app.kubernetes.io/name: <服務名稱>,換成 operator 管理的資料庫,Zeabur 寫的資料庫物件和機密帶有 zeabur.com/database: <名稱>。下面的 db 換成了 PostgreSQL:

kubectl -n shop get deploy,svc,pvc,secret -l app.kubernetes.io/name=web
kubectl -n shop get clusters.postgresql.cnpg.io,secret -l zeabur.com/database=db
kubectl -n shop get deployment web -o jsonpath='{.spec.template.spec.initContainers[*].name}'

有 depends_on 的服務會多出 wait-1、wait-2 等初始化容器,它們用 nc -z 等相依服務的連接埠能連線才結束。

把 Compose 檔案轉成服務的步驟只在介面上做,Zeabur 不保存 Compose 檔案,叢集裡也沒有對應的物件。轉換結果是一般的 Kubernetes 物件,跟手動建立的一樣:

不用介面時,可以照上面兩頁自己寫 YAML,或用 Kompose 轉換後再修改。Zeabur 的轉換規則參考 Kompose,但名稱、標籤和安全性設定不同,兩者的輸出不會一模一樣。

  • 名稱已存在:這個流程只建立物件。回到 Compose 修改服務名稱並重新讀取,或改用其他專案。
  • 某個服務沒有建立:檢查它是否只有 build:。替它指定可下載的映像檔,或另外從 Git 部署。
  • 應用程式連不到新資料庫:檢查無法改寫的參照、改名後的主機與實際變數名稱。可在資料庫的 連線 使用 接到服務,詳見資料庫。
  • 原本共用的檔案不見了:匯入的磁碟區各自獨立。檢查原 Compose 是否靠多服務共用同一個磁碟區,重新安排儲存方式並搬移檔案。
  • 只建立了部分物件:Zeabur 依序建立物件,中途失敗時,已建立的物件會留在叢集。依畫面列出的結果補建或刪除。

要清除這次匯入,逐一使用服務的 刪除服務、資料庫的 刪除資料庫 與物件儲存的 刪除物件儲存,並檢查各自的刪除清單。Zeabur 沒有保存 Compose 檔案,所以沒有一次刪掉整份匯入的按鈕。