Skip to content
Open Source

設定環境變數

修改服務啟動時讀取的設定,或讓多個服務讀取同一組共用變數。

開啟服務的 環境變數,按 編輯,改完後從頁面下方 檢查變更 並套用。直接設定在服務上的變數會隨著新副本啟動而生效。如果值來自共用設定檔或機密,要到來源修改,並確認哪些服務需要重新啟動。

  • 已有一個服務,並且有權修改它。如果服務標示由 Helm、Argo CD 或 Flux 管理,要回到原本的 values 或 Git 儲存庫修改。
  • 知道應用程式需要的變數名稱和值,例如 APP_URL 或 LOG_LEVEL。這裡設定的是容器執行時的環境變數。從 Git 部署的建置變數在建置設定中修改。
  • 密碼或 API 金鑰適合放在機密中。直接設定 的值會顯示在服務設定裡。共用變數選 Secret 後,只有有權讀取機密的人能顯示值。

進入專案,選擇服務,再開啟 環境變數 → 編輯。在 直接設定 修改名稱或值,按 新增變數 加一列。有多個容器時,為新變數選擇要讀取它的容器。

在名稱欄貼上多行 NAME=value,可以一次新增多個變數。單一容器也可以切到 .env 編輯方式:

APP_URL=https://app.example.com
LOG_LEVEL=info

.env 編輯器支援引號、export 和 # 註解。從編輯內容拿掉原本的一行,會把該變數列為移除。

查看標成 新增、已修改 或 將移除 的列,再按頁面下方 檢查變更。確認容器、變數名稱及其他一起等待套用的設定,再套用這批變更。

直接修改變數會更新服務的 Pod template。Deployment、StatefulSet 這類持續執行的服務會用新設定替換副本。CronJob 則從下一次執行開始讀到新值。

回到 概覽 等待副本就緒,再從應用程式的實際行為或 日誌 確認,例如新產生的連結是否使用新的 APP_URL。環境變數清單會顯示儲存後的設定。

尚未套用時,按 捨棄 可放棄這批草稿。已套用的變更,要把值改回去,再次檢查並套用。

來自設定檔和機密 列出每個變數的來源。點來源名稱即可開啟編輯器。來源若是機密,按 顯示值 才會讀取目前的值。也可以直接填入新值,不必先顯示舊值。標成 二進位 的設定檔資料要用 YAML 修改。

先看編輯器上方的 讀取它的服務。例如 web 和 worker 都讀取 app-config,從 web 開啟編輯器後改值,兩個服務的來源都會改。把它掛成檔案的服務也會列在裡面。

修改鍵或按 新增鍵 後,送出檢查。從服務頁面開啟的來源編輯器會把修改加入該服務的草稿,仍要從頁面下方 檢查變更 並套用。從專案 設定 開啟同一個來源時,則會直接開啟變更檢查。

改 ConfigMap 或 Secret 的內容後,已啟動的容器環境變數會保留舊值。變更檢查會列出需要重新啟動的服務,以及可能由 Reloader 自動重新啟動的服務。

  • 手動處理時,對每個需要新值的服務執行 重新啟動,再檢查副本是否就緒。
  • 要自動處理,進入服務 設定 → 運算資源,開啟 設定檔或機密變數變更時自動重新啟動,再檢查並套用。叢集要有正在執行的 Stakater Reloader,單獨開啟選項不會重新啟動服務。
  • 開啟後,不論是在 Zeabur 還是用其他工具修改來源,服務都會重新啟動。如果讀取這個來源的服務都開了這個選項,它們會一起重新啟動。

看到 重新啟動前可能仍在使用舊的值,表示來源在某個副本啟動後才改過。展開提示可以看到是哪些副本。已經跑完的 Job 不會因為來源改了而重新執行。

進入專案 設定 的 共用變數,按 新增共用變數。輸入 名稱,在 值的保存方式 選 Secret 或 明文,再於 變數 每行輸入一個 NAME=value。

按 檢查變更,確認後按 建立。這一步只建立共用變數,服務還不會讀取它。

回到服務的 環境變數,按 使用共用變數。選擇剛建立的那組變數。服務有多個容器時,也要選擇容器。

  • 所有鍵:每個鍵都會成為環境變數,之後新增的鍵也會納入。
  • 單一個鍵:選 鍵,再設定容器裡的 變數名稱,例如把 api-token 讀成 API_TOKEN。

這個側邊面板有自己的 檢查變更 和套用步驟,不會加入服務頁面下方的草稿。套用後,持續執行的服務會替換副本,新副本就會讀到這些變數。

在服務的 來自設定檔和機密 確認來源名稱,再回到專案 設定 → 共用變數,確認 使用的服務 出現該服務。等新副本就緒後,再確認應用程式的設定。

環境變數寫在工作負載的 Pod template 裡,共用變數是一般的 ConfigMap 或 Secret,Zeabur 沒有另外保存任何資料。以下以專案 demo、服務 web 為例。

直接設定和移除一個變數,等於修改容器的 env:

kubectl -n demo set env deployment/web NODE_ENV=production
kubectl -n demo set env deployment/web NODE_ENV-

共用變數就是帶 zeabur.com/shared-variables: "true" 標籤的 ConfigMap 或 Secret。專案 設定 → 共用變數 依這個標籤列出它們:

apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: demo
labels:
zeabur.com/shared-variables: "true"
data:
APP_URL: https://app.example.com
LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
namespace: demo
labels:
zeabur.com/shared-variables: "true"
type: Opaque
stringData:
api-token: change-me

服務讀取共用變數的方式寫在容器上。所有鍵 是 envFrom,單一個鍵 是 env 的 valueFrom。設定檔或機密變數變更時自動重新啟動 是工作負載本身(不是 Pod template)的 annotation reloader.stakater.com/auto: "true",只有 Deployment、StatefulSet 和 DaemonSet 能開:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: demo
labels:
app.kubernetes.io/name: web
annotations:
reloader.stakater.com/auto: "true"
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: web
template:
metadata:
labels:
app.kubernetes.io/name: web
spec:
containers:
- name: web
image: nginxinc/nginx-unprivileged:1.29
env:
- name: NODE_ENV
value: production
- name: API_TOKEN
valueFrom:
secretKeyRef:
name: app-secrets
key: api-token
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: app-config

只開關自動重新啟動,用 annotate 就好,它不會替換副本:

kubectl -n demo annotate deployment web reloader.stakater.com/auto=true
kubectl -n demo annotate deployment web reloader.stakater.com/auto-

改了共用來源、又沒有 Reloader 時,自己重新啟動讀取它的服務:

kubectl -n demo rollout restart deployment/web

移除 Zeabur 之後,這些變數照樣由 Kubernetes 注入容器。Reloader 是獨立的元件,也會繼續依 annotation 重新啟動服務。

在 環境變數 分頁,直接設定的變數列在 直接設定,從共用變數讀來的列在 來自設定檔和機密,並寫出來源名稱。專案 設定 → 共用變數 的 使用的服務 會列出讀取它的服務。

用 kubectl 看 Pod template 裡的設定,和實際在容器裡的值:

kubectl -n demo get deployment web -o jsonpath='{.spec.template.spec.containers[0].env}'
kubectl -n demo get configmap,secret -l zeabur.com/shared-variables=true
kubectl -n demo exec deploy/web -- printenv NODE_ENV

printenv 印出新值,表示副本已經用新設定啟動。印出舊值時,等新副本就緒,或照上面的步驟重新啟動。

畫面或結果接著處理
另一個變數已經用了這個名稱 或 設定檔、機密或 Kubernetes 已經設定了這個名稱到該變數的來源修改,或換一個名稱。同一個容器裡的同名變數只會有一個值生效。
沒有 使用共用變數先到專案 設定 建立至少一組共用變數。服務正在編輯變數或由其他工具管理時,也不會顯示這個按鈕。
你沒有讀取 Secret 的權限,所以值會隱藏。顯示機密需要讀取 Secret 的權限,和修改服務的權限分開,見權限。
共用來源已改,應用程式仍使用舊值重新啟動讀取它的服務。如果已開啟自動重新啟動,到服務 設定 → 運算資源 看 Reloader 是否在執行。
顯示變更已過期重新檢查目前的來源和值,再套用新的變更。

直接設定的變數可在 編輯 中按該列的移除按鈕,再檢查並套用。

整組匯入的變數,在來源列選 停止讀取,再檢查並套用。這會移除服務的讀取關係,保留共用來源。

只讀取單一鍵的變數,在來源旁選 移除變數,再檢查並套用。共用來源和其中所有的鍵都會保留,只移除服務上的這個變數。

要刪掉整組共用變數,先在專案 設定 → 共用變數 確認 使用的服務 已經清空,再到專案 物件 開啟對應的 ConfigMap 或 Secret,在 YAML 按 刪除,檢查後套用。如果還有服務讀取其中的鍵,之後啟動的副本會因為找不到這個來源而無法啟動。

應用程式的公開網址改了,也要一併查看網域與 APP_URL 等變數。維護期間的訪客流量可另用維護模式處理。