【问题标题】:Host environment variables with docker stack deploy使用 docker stack deploy 托管环境变量
【发布时间】:2018-02-28 09:07:34
【问题描述】:

我想知道是否有一种方法可以使用从部署容器的主机获取的环境变量,而不是从执行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 应该取自实际部署容器的主机,并且每个容器的值不应相同。 有正确的方法吗?

【问题讨论】:

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


    【解决方案1】:

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

    1. Swarm node labels,其中Hostname是内置的之一。
    2. Swarm service go templates,也适用于堆栈文件。

    这会将主机名拉入 DUDE 的 ENV 值,以使每个容器成为它正在运行的主机:

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

    【讨论】:

    • 您的解决方案确实有效,但并不能完全回答我的回答。假设我有一个想要读取的非内置变量?这可能吗?
    • 当然,您应该了解 Swarm 节点标签或主机标签。主机标签在 /etc/docker/daemon.json 中设置,但在 Swarm 中不经常使用。群标签通过docker node update--label-add--label-rm 设置,并设置您想要的任何键/值:)
    • 然后你可以用同样的方式访问它,只是中间有“标签”.Node.Labels.LabelName
    • 酷...不知道!
    • 我试过这个方法,但它不起作用。这就是我所做的:sudo docker node update --label-add ip='192.168.121.59' q687wox1uet33k4ubfvfa6p74。然后我在环境部分的撰写文件中使用了这个标签:环境:-KAFKA_HOST_IP:“{{.Node.Labels.ip}}”。启动堆栈: sudo -E docker stack deploy -c docker-compose.yml 服务。出错-> desc = 扩展环境失败:扩展环境“KAFKA_HOST_IP={{.Node.Labels.ip}}”:模板:扩展:1:7:在 <.node.labels.ip> 处执行“扩展”:可以'不评估 struct { ID 字符串类型中的字段标签;主机名字符串;平台模板.Platform }
    【解决方案2】:

    如果你通过env运行docker命令,它就可以工作。

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

    感谢GitHub issue,它为我指明了正确的方向。

    【讨论】:

    • 这是在堆栈 yml 文件中替换变量的正确答案。这是一个不同的问题,然后添加到容器环境中
    • 这到底是怎么工作的? env JMX_HOSTNAME="${JMX_HOSTNAME}" 将在 docker 看到它之前由 shell 插入。所以,docker 会看到env JMX_HOSTNAME=master_host_env_value docker ...。我在这里错过了什么吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      相关资源
      最近更新 更多