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

Ale*_*isi 6 docker docker-swarm docker-swarm-mode

我想知道是否有办法使用从部署容器的主机获取的环境变量,而不是从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"
Run Code Online (Sandbox Code Playgroud)

JMX_HOSTNAME应当从容器部署,不应该成为每个容器相同的值主机服用.有没有正确的方法来做到这一点?

Bre*_*her 15

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

  1. Swarm 节点标签,其中Hostname是内置节点标签之一.
  2. Swarm 服务转到模板,它也可以在堆栈文件中工作.

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

version: '3.4'

services:
  nginx:
    image: nginx
    environment:
      DUDE: "{{.Node.Hostname}}"
    deploy:
      replicas: 3
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过这种方法,但它不起作用.这就是我所做的:sudo docker node update --label-add ip ='192.168.121.59'q687wox1uet33k4ubfvfa6p74.然后我在环境部分的compose文件中使用了这个标签:environment: - KAFKA_HOST_IP:"{{.Name.Labels.ip}}".启动堆栈:sudo -E docker stack deploy -c docker-compose.yml service.得到错误 - > desc =扩展env失败:扩展env"KAFKA_HOST_IP = {{.Node.Labels.ip}}":模板:扩展:1:7:在<.Node.Labels.ip>执行"扩展":can不要在类型struct {ID string;中评估字段标签; 主机名字符串; 平台模板.平台} (3认同)
  • 然后您可以以相同的方式访问它,但在中间的".Node.Labels.LabelName"中使用"标签" (2认同)

Tim*_*Tim 5

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

env JMX_HOSTNAME="${JMX_HOSTNAME}" docker stack deploy -c docker-compose.yml mystack
Run Code Online (Sandbox Code Playgroud)

感谢GitHub的问题是指出我朝着正确的方向发展。