Docker Stack Deploy 不會像 Docker Compose 那樣解析具有預設值的環境變量

Docker Stack Deploy 不會像 Docker Compose 那樣解析具有預設值的環境變量

我有以下範例文件

docker-compose.yml

version: '3'
services:
  web:
    image: webapp:${VARIABLE_A:-${VARIABLE_B}}

env.conf

VARIABLE_B=123

VARIABLE_A不是故意設定的,所以它應該回退到VARIABLE_B

Docker compose 能夠解析環境變數的預設值,但docker stack deploy無法進行相同的解析

user@laptop:~$ docker compose --env-file ./env.conf convert

name: dockercomposetest
services:
  web:
    image: webapp:123
    networks:
      default: null
networks:
  default:
    name: dockercomposetest_default
user@laptop:~$ env $(cat ./env.conf | xargs) docker stack deploy --compose-file docker-compose.yml stack

Creating service stack_web
failed to create service stack_web: 
  Error response from daemon: 
  rpc error: 
    code = InvalidArgument desc = ContainerSpec: "webapp:${VARIABLE_B}" is not a valid repository/tag

正如您所看到的,使用時docker stack deploy它會偵測${VARIABLE_A:-${VARIABLE_B}}到一個環境變量,因為VARIABLE_A未設置,所以它應該預設為,${VARIABLE_B}但它不會解析其值,即123

顯然,webapp不存在,這只是一個例子,但上面的錯誤輸出應該是這樣的

user@laptop:~$ env $(cat ./env.conf | xargs) docker stack deploy --compose-file docker-compose.yml stack

Creating service stack_web
failed to create service stack_web: 
  Error response from daemon: 
  rpc error: 
    code = InvalidArgument desc = ContainerSpec: "webapp:123" is not a valid repository/tag

為什麼會出現這種情況?有沒有解決方法?

答案1

參考參考莫比1.13 中的 docker stack deploy 不會像 docker-compose up 那樣載入 .env 文件。具體來說金皇的評論

「我讓我的開發人員使用 docker-compose 配置來預處理 Docker Compose 項目,然後將它們傳遞給 docker stack 部署。您可以透過以下命令一行完成此操作:

docker stack deploy -c <(docker-compose config) stack-name-here

這樣,包括 .env 處理在內的所有 Docker Compose 功能都將充分應用。

答案2

我最終所做的解決方法docker stack deploy是使用envsubst替換環境變量

user@laptop:~$ env $(cat ./env.conf | xargs) envsubst < ./docker-compose.yml | docker stack deploy --compose-file - stack

文件說,透過使用--compose-file -它將stdin作為 docker compose 文件,所以基本上它的作用是先解析 中的所有變量,docker-compose.yml然後使用管道將結果傳遞給docker stack deploy

答案3

這是解決這個問題的另一個好方法。您必須建立一個「.env」文件,其中包含要新增到環境中的所有變量,例如:APP_NAME=Example。然後在 stack-compose.yml 中您可以這樣聲明:

version: "3.9" 
services: 
  myservice: 
    env_file: 
      - .env

之後,您應該執行以下命令:

docker stack config -c stack-compose.yml | docker stack deploy -c - mystackname

這會將您在 .env 檔案中宣告的變數插入 stack_compose.yml 中,如下所示:

version: "3.9"
services:
  myservice:
    environment:
      APP_NAME: "Example"

在這個連結中如何在docker swarm堆疊中傳遞環境變數

您會找到關於如何執行此操作的非常好的解釋。我遇到了同樣的問題並以這種方式克服了它。問候

相關內容