从一个docker compose托管docker swarm,但节点变量为

从一个docker compose托管docker swarm,但节点变量为,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,我希望能够从使用env变量的同一docker compose文件运行swarm。目前我只知道所有节点都在复制Leaders env。是否可以让每个节点从其自己的本地环境变量开始 我的码头工人 version: '3.1' networks: base: services: test: container_name: ${Name} restart: always image: ubuntu:latest environment: - Nam

我希望能够从使用env变量的同一docker compose文件运行swarm。目前我只知道所有节点都在复制Leaders env。是否可以让每个节点从其自己的本地环境变量开始

我的码头工人

version: '3.1'

networks:
  base:

services:
  test:
    container_name: ${Name}
    restart: always
    image: ubuntu:latest
    environment:
      - Name=${Name}
    command: sh -c "echo $Name && sleep 30"
    networks:
      - base

使用
env_文件
选项

docker日志
#测试_ENV='stackoverflow'
您可以在不同的容器中设置具有不同名称的环境文件。
比如说

#docker-compose.yaml,文件
版本:“3.1”
服务:
测试1:
容器名称:test1
重新启动:始终
图片:ubuntu:最新版本
环境文件:
-第一,环境
命令:sh-c“set | grep TEST _FIRST _ENV&&sleep 30”
测试2:
容器名称:test2
重新启动:始终
图片:ubuntu:最新版本
环境文件:
-第二,环境
命令:sh-c“set | grep TEST _SECOND _ENV&&sleep 30”

使用
环境文件
选项

docker日志
#测试_ENV='stackoverflow'
您可以在不同的容器中设置具有不同名称的环境文件。
比如说

#docker-compose.yaml,文件
版本:“3.1”
服务:
测试1:
容器名称:test1
重新启动:始终
图片:ubuntu:最新版本
环境文件:
-第一,环境
命令:sh-c“set | grep TEST _FIRST _ENV&&sleep 30”
测试2:
容器名称:test2
重新启动:始终
图片:ubuntu:最新版本
环境文件:
-第二,环境
命令:sh-c“set | grep TEST _SECOND _ENV&&sleep 30”

docker-compose.yml文件中引用的环境变量在leader上没有解析,甚至在swarm部署的任何跳转框上也没有解析

如果要从主机系统、命令或入口点iirc引用env变量,可以转义对“$$Name”的引用,但这将仅使env变量可用于在主机上计算的入口点或命令脚本,而不是容器名称之类的值

考虑到您的特定用例,您可能正在寻找服务创建模板:它们允许您将每个服务实例的值注入到
主机名
装载
环境中

版本:“3.8”
服务:
测试:
环境:
我的主机名:“{{.Node.HOSTNAME}”
...

有关支持的值的完整列表,请参阅。

docker-compose.yml文件中引用的环境变量在leader上没有解析,甚至在swarm部署的任何跳转框上也没有解析

如果要从主机系统、命令或入口点iirc引用env变量,可以转义对“$$Name”的引用,但这将仅使env变量可用于在主机上计算的入口点或命令脚本,而不是容器名称之类的值

考虑到您的特定用例,您可能正在寻找服务创建模板:它们允许您将每个服务实例的值注入到
主机名
装载
环境中

版本:“3.8”
服务:
测试:
环境:
我的主机名:“{{.Node.HOSTNAME}”
...

有关支持的值的完整列表,请参阅。

这是一个技巧。但我仍然有一个问题,我已经将它作为环境插入:-Name={{.Node.Hostname}和local env工作,即使我将它执行到容器中,我也可以正确地打印它,但是如果我在我的compose中运行命令:bash-c'echo Name=$Name&&sleep infinity',它不会识别$Name vari,我不确定确切的语法。但是您可能需要将compose中的命令双重转义为$$Name,这样docker compose实际上会将$Name传递给容器中的bash进行计算。是的,我最近发现了这个问题,正确的方法是:command:bash-c'echo Name=$$Name&&sleep infinity'这是一个技巧。但我仍然有一个问题,我已经将它作为环境插入:-Name={{.Node.Hostname}和local env工作,即使我将它执行到容器中,我也可以正确地打印它,但是如果我在我的compose中运行命令:bash-c'echo Name=$Name&&sleep infinity',它不会识别$Name vari,我不确定确切的语法。但是您可能需要将compose中的命令双重转义为$$Name,这样docker compose实际上会将$Name传递给容器中的bash进行求值。是的,我最近发现了这个问题,正确的方法是:command:bash-c'echo Name=$$Name&&sleep infinity'谢谢您的回答,这很有效,但在我的情况下,在一个文件中管理所有环境有点困难。我建议编写一个构建脚本,从一个环境文件为
build
目录中的每个容器生成环境文件祝你好运Guy有点误解了你的建议谢谢你的回答,这很有效,但在我的情况下,在一个文件中管理所有环境有点困难我建议编写一个构建脚本,从一个环境文件为
build
目录中的每个容器生成环境文件祝你好运Guy有点误解了你的建议
# .env, file
Name=<your_name>
# <your_name>.env, file
TEST_ENV=stackoverflow