我曾经将我的图片版本外化到我的.env文件中。这样可以轻松维护,我不会修改我的docker-compose.yml
文件只是为了升级版本,所以我确定我不会错误删除某行或其他任何内容。
但是,当我尝试使用stack
将我的服务部署到swarm
时,docker引擎会抱怨我的图片不是正确的重新定位/标记,并提供以下消息:
来自守护程序的错误响应:rpc错误:代码= 3 desc = ContainerSpec:" GROUP / IMAGE:"不是有效的存储库/标记
要解决此问题,我可以直接在docker-compose.yml
文件中修复图片版本。这里有任何逻辑还是错误?但是这个混合修复了docker-compose和variable的部分内容。
干杯, 奥利弗
答案 0 :(得分:3)
答案很简单:它不是错误,也不是功能。 .env
目前不支持docker stack
。
在运行.env
export $(cat .env)
正在运行的docker stack ...
在Docker Github中讨论这种需求存在一个问题。 https://github.com/docker/docker.github.io/issues/3654 另一个讨论问题和解决方案:https://github.com/moby/moby/issues/29133#issuecomment-285980447
答案 1 :(得分:3)
如上所述,.env
目前不支持docker stack
。
因此,另一种方法是使用env_file
明确指定环境文件,例如:
version: '3.3'
services:
foo-service:
image: foo-image
env_file:
- .env
environment:
- SOME_ENV=qwerty
答案 2 :(得分:2)
docker stack deploy
中的yaml解析器与docker-compose
中的yaml解析器的功能不同。但是,在完成所有变量替换,扩展其他文件以及将多个文件合并在一起之后,您可以使用docker-compose config
输出yaml文件。这有效地将docker-compose
转换为预处理器。
答案 3 :(得分:2)
您可以创建一个 deploy.sh
export $(cat .env) > /dev/null 2>&1; docker stack deploy ${1:-STACK_NAME}
.env
解析没有正则表达式或不稳定的技巧。stderr
中的 #comments
在 .env
上产生的错误将被重定向到 stdin
(2>&1)export
和 error
现在也出现在 stdin
上的不想要的打印也被重定向到 /dev/null
。这可以防止控制台泛滥。.env
。我们可以在 STACK_NAME
中定义 .env
但我们也可以传递我们自定义的 stack_name
. deploy.sh <stack_name> (stack_name opcional)
这个解决方法让我头疼了 3 个晚上
答案 4 :(得分:0)
我遇到了同样的问题, 我的问题是由在其他python虚拟环境中运行docker-compose引起的。
我希望这会有所帮助。
似乎通过在不同的python虚拟env上运行,我破坏了docker-compose依赖项pythondotenv