我正在尝试使用变量替换在docker中部署堆栈,但是当我运行docker stack deploy --compose-file email.yaml email
时,出现无效的引用格式错误。这是我的email.yaml:
version: '3'
services:
emailservice:
image: 'email:${VERSION}'
deploy:
replicas: 2
restart_policy:
condition: on-failure
resources:
limits:
memory: 300 MB
update_config:
delay: 12s
ports:
- "8000:80"
我已经尝试过email:${VERSION}
和"email:${VERSION}"
,但是它也不起作用。
另一方面,我已经阅读到在docker stack deploy中,我无法使用.env文件传递变量。我应该如何通过它们?
谢谢!
答案 0 :(得分:1)
为此打开了一个feature request。 我遇到了同样的问题,而我能找到的最佳解决方法来自this comment。
建议的解决方法使用docker-compose config
生成docker-compose.yml输出(使用变量替换):
docker-compose config | docker stack deploy --compose-file - stack_name
答案 1 :(得分:1)
docker stack deploy 默认不处理 .env 文件。这是一个 docker-compose 功能。您可以在一行中对其进行预处理。
docker stack deploy -c <(docker-compose config) stack-name-here
参考:https://github.com/moby/moby/issues/29133#issuecomment-442912378
答案 2 :(得分:0)
Docker Compose自动加载.env
文件,但docker stack deploy
不会自动加载(请参阅Compose文件参考的Variable substitution部分中的注释)。
您可以通过在与env VAR=VALUE
相同的行中使用docker stack deploy
来解决此问题:
$ env VERSION=1.2 docker stack deploy -c email.yaml email
您使用的语法是正确的,但是由于缺少替换导致您看到错误。
或者,您可以强制使用${VERSION:?}
语法要求来定义变量,这将停止部署并显示易于与丢失的变量相关的错误:
$ docker stack deploy -c email.yaml email
invalid interpolation format for services.emailservice.image: "required variable VERSION is missing a value: ". You may need to escape any $ with another $.
希望有帮助。