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

Host environment variables with docker stack deploy

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

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

  1. Swarm node labels,其中主机名是 built-in 之一。
  2. Swarm service go templates,它也适用于堆栈文件。

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

version: '3.4'

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

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

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

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

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