具有docker堆栈部署的主机环境变量

时间:2018-02-28 09:07:34

标签: docker docker-swarm docker-swarm-mode

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

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 个答案:

答案 0 :(得分:12)

是的,当你将两个概念结合起来时,这是有效的:

  1. Swarm node labels,其中Hostname是其中一个内置的。
  2. Swarm service go templates,它也适用于堆栈文件。
  3. 这会将主机名拉入DUDE的ENV值,使每个容器成为它运行的主机:

    version: '3.4'
    
    services:
      nginx:
        image: nginx
        environment:
          DUDE: "{{.Node.Hostname}}"
        deploy:
          replicas: 3
    

答案 1 :(得分:1)

当你有很多环境变量时,我找到了另一种方法。同样的方法也适用于 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.

答案 2 :(得分:0)

如果您通过env运行docker命令,它将起作用。

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

贷记GitHub issue,向我指出正确的方向。