具有 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
应该取自实际部署容器的主机,并且每个容器的值不应该相同。
有正确的方法吗?
是的,当您结合两个概念时这会起作用:
- Swarm node labels,其中主机名是 built-in 之一。
- 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.
我想知道是否有一种方法可以使用从部署容器的主机获取的环境变量,而不是从执行 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
应该取自实际部署容器的主机,并且每个容器的值不应该相同。
有正确的方法吗?
是的,当您结合两个概念时这会起作用:
- Swarm node labels,其中主机名是 built-in 之一。
- 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.