部署自訂 Prebuilt

自訂 Prebuilt

雖然 Zeabur 已經涵蓋眾多由社群提供的 Prebuilt Images 和模板,但你可能會需要部署自己的 Docker 映像、設定持久化儲存、設定啟動命令等等。Zeabur 針對這個需求,提供了 Prebuilt 的自訂功能。

💡

Prebuilt 主要是針對單個服務的部署,〈模板〉則涵蓋了一鍵部署多個服務 (Docker Compose) 的功能。

打開介面

點選「Add Service」→「Prebuilt Images」→「Customize」打開自訂 Prebuilt 的頁面。

打開自訂 Prebuilt 的頁面

設定說明

Image

Image 設定說明

「Image」為要拉取的 Docker image,通常就是緊隨 docker pulldocker run 後面的 image tag,比如

docker pull mariadb      # tag 是 "mariadb"
docker run mariadb:lts   # tag 是 "mariadb:lts"

或者是 Docker Compose 中的這個地方

version: '3.9'
services:
  db:
    image: postgres      # tag 是 "postgres"
    # ...

設定完成後,即可接下去設定環境變數、Port⋯⋯等等的 Prebuilt 啟動設定。

Environment Variable

環境變數的設定範例

「Environment Variable」,顧名思義就是傳給服務的環境變數。不過除了單純的環境變數設定外,Zeabur 也允許你將環境變數傳給其他服務 (Expose),甚至是設定「不能再次更改」(Readonly),讓你有更大的環境變數設定彈性。

「Key」是環境變數的鍵,只能由英文字母、數字和底線組成,如 MARIADB_USERDB_1_HOST 都是可以接受的。

「Value」則是環境變數的值,裡面可以使用 ${KEY} 來在引用其他環境變數的 key。如上圖中 MARIADB_PASSWORD 直接引用了 MARIADB_ROOT_PASSWORD,所以 MARIADB_PASSWORD 的值就會等於 123456;同理,假如有個環境變數的值是 password=${MARIADB_PASSWORD},展開之後的結果就是 password=123456${KEY} 這種引用格式 會在服務啟動時直接展開,所以應用程式看到的會是已經展開完成的值,你不需要在應用層重新展開。

「Expose」指把環境變數的鍵值同時套用到其他服務上。以上圖為例,MARIADB_USERNAMEMARIADB_PASSWORD 都有核取 Expose,所以同專案底下的其他服務都可以看到 MARIADB_USERNAMEMARIADB_PASSWORD 這兩個環境變數,當然也可以使用 ${KEY} 引用它們。

「Readonly」則代表「變數在 Prebuilt 建立後不能由使用者修改」。以上圖為例,MARIADB_PASSWORD 打勾了 Readonly,所以之後直接針對 MARIADB_PASSWORD 的修改都不會作用(不過修改 MARIADB_ROOT_PASSWORD 後,MARIADB_PASSWORD 的值依然會變化)。

除了其他服務 Exposed 的變數以外,你也可以使用 Zeabur 預先定義好的特殊變數,比如使用 ${ZEABUR_WEB_URL} 取回設定在 web port 的網址。

如果你在參考 Docker image 的文件,通常環境變數在 docker run 之後的 --env(或 -e)引數中,如下範例所示。

docker run --detach --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_DATABASE=example-database --env MARIADB_ROOT_PASSWORD=my-secret-pw  mariadb:latest
 
# MARIADB_USER          = example-user
# MARIADB_PASSWORD      = my_cool_secret
# MARIADB_DATABASE      = example-database
# MARIADB_ROOT_PASSWORD = my-secret-pw

如果是 Docker Compose,則是

version: '3.9'
services:
  adminer:
    image: adminer
    restart: always
    environment:
      DEBUG: "true"   # (or) - DEBUG=true
      # DEBUG = true

Ports

Ports 的設定範例

「Ports」相當於防火牆的連入 (inbound) 規則,只有宣告的 Ports 可以被其他服務或外網連線。

「Port Name」只能由英文字母和連接號組成。「Port」則寫上服務監聽的 Port,如 MariaDB 就是 3306;Web 服務大部分都是 8080, 3000, 80, …。

「Port Type」可以是 HTTPTCP。外網的部分,HTTP 可以使用網域(如 my-service.zeabur.app)直連,同時 Zeabur 也會自動簽署 TLS 憑證;TCP 則可以使用 Zeabur 自動分配的轉送主機名稱和 Port 連線(如 reg.clusters.zeabur.com:12345)。如果是服務之間,可以使用 服務內網 直連到服務,減少不必要的流量費用,此時 Port 直接填寫你宣告的 Port 即可(亦即 mariadb.zeabur.internal:3306backend.zeabur.internal:8080)。

如果你看得是 Docker image 的文件,通常環境變數在 docker run 之後的 -p 參數中,如下範例所示。

docker run -p 3306 mariadb:latest
 
# Port Name = <Custom>; Port = 3306; Port Type = TCP
# TCP 是因為 MariaDB 是使用基於 TCP 的自訂協定。

如果是 Docker Compose,則是

version: '3.9'
services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 80:8080
      # Port Name = <Custom>; Port = 8080; Port Type = HTTP
      # HTTP 是因為 adminer 是一個管理資料庫的 PHP Web 介面。

Volumes

Volumes 的設定範例

「Volumes」是持久儲存空間的掛載路徑。

預設情況下 Zeabur 在服務每次重新啟動時,都會將服務裡面的資料重設回 Image 的預設狀態(又稱 Stateless)。假如你需要在容器中長期儲存資料,可以配置一個持久儲存空間,並掛載在你想長期儲存的目錄下,這樣服務無論重啟還是更新,掛載的目錄都不會更動——直到你刪除服務或者是自己修改目錄的內容。另外服務的「Backup」功能也是備份這個空間的資料。持久儲存空間的收費方式可以參閱 Zeabur 的 Pricing 頁面

「Volume id」為儲存空間的代號,只能輸入英文字母、數字和連接號。「Path」 為儲存空間的掛載路徑,可以參考 Docker image 的 Volume 設定做配置。

如果你看得是 Docker image 的文件,通常環境變數在 docker run 之後的 -p 參數中,如下範例所示。

docker run -v your-storage:/var/lib/mysql mariadb:latest
 
# Volume ID = <Custom>; Path = /var/lib/mysql

如果是 Docker Compose,則是

version: '3.9'
services:
  mariadb:
    image: mariadb
    volumes:
      - your-storage:/var/lib/mysql
      # Volume ID = <Custom>; Path = /var/lib/mysql

Start Command

Start Command 的設定範例

「Start Command」讓你可以改掉 Docker image 預設使用的 Entrypoint 和引數。這部分比較進階,如果你不太清楚意義,可以略過。

從 GUI 建立的 Start Command 預設的 Command 都是 /bin/sh。如果你的 Command 不是 /bin/sh,可使用 Edit TOML 功能直接修改,或與 客服 討論更改方式。

手動撰寫 Prebuilt TOML

雖然 GUI 已經提供了製作 Prebuilt 服務必要的眾多參數,但你或許想要加入自訂的 icon、配置服務連線指引 (Instruction)、設定更多更細的項目⋯⋯這時候你可以使用 Edit TOML 幫助你撰寫功能更完善(也更為複雜的)Prebuilt TOML 檔案。

Edit TOML 的打開方式

每個欄位的說明可以參考 Prebuilt TOML 的 JSON schema 文件,TOML 的撰寫說明可以參閱這份 TOML 格式文件。如果有任何撰寫上的疑問,歡迎與 客服 詢問。