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

问题描述 投票:4回答:1

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

docker docker-swarm docker-swarm-mode
1个回答
12
投票

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

  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
© www.soinside.com 2019 - 2024. All rights reserved.