代码之家  ›  专栏  ›  技术社区  ›  Alessandro Dionisi

具有docker stack deploy的主机环境变量

  •  15
  • Alessandro Dionisi  · 技术社区  · 7 年前

    我想知道是否有一种方法可以使用从部署容器的主机获取的环境变量,而不是从 docker stack deploy 执行命令。例如,想象一下 docker-compose.yml 在三节点Docker Swarm群集上启动:

    version: '3.2'
    services:
      kafka:
        image: wurstmeister/kafka
        ports:
          - target: 9094
            published: 9094
            protocol: tcp
            mode: host
        deploy:
          mode: global
        environment:
          KAFKA_JMX_OPTS: "-Djava.rmi.server.hostname=${JMX_HOSTNAME} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=1099"
    

    这个 JMX_HOSTNAME 应该从实际部署容器的主机获取,并且每个容器的值不应该相同。 有没有正确的方法?

    3 回复  |  直到 7 年前
        1
  •  28
  •   Bret Fisher    7 年前

    是的,当您将两个概念结合在一起时,这会起作用:

    1. 一大群 node labels ,其中主机名是内置主机名之一。
    2. 一大群 service go templates ,这也适用于堆栈文件。

    这会将主机名拉入到每个容器的ENV值DUDE中,使其成为运行该容器的主机:

    version: '3.4'
    
    services:
      nginx:
        image: nginx
        environment:
          DUDE: "{{.Node.Hostname}}"
        deploy:
          replicas: 3
    
        2
  •  5
  •   Tim    5 年前

    如果运行docker命令 env .

    env JMX_HOSTNAME="${JMX_HOSTNAME}" docker stack deploy -c docker-compose.yml mystack
    

    贷记至 GitHub issue 这为我指明了正确的方向。

        3
  •  2
  •   B. Bilgin    4 年前

    我找到了另一种方法,当你有很多环境变量时。同样的方法也适用于 docker-compose up

    sudo -E docker stack deploy -c docker-compose.yml mystack
    

    而不是

    env foo="${foo}" bar="${bar}" docker stack deploy -c docker-compose.yml mystack
    

    sudo -E 人员描述;

       -E, --preserve-env
                   Indicates to the security policy that the user wishes to
                   preserve their existing environment variables.  The
                   security policy may return an error if the user does not
                   have permission to preserve the environment.