
我有以下範例文件
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堆疊中傳遞環境變數
您會找到關於如何執行此操作的非常好的解釋。我遇到了同樣的問題並以這種方式克服了它。問候