我想知道是否有办法使用从部署容器的主机获取的环境变量,而不是从执行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
应该从实际部署容器的主机中获取,并且不应该是每个容器的相同值。
有没有正确的方法来做到这一点?
答案 0 :(得分:12)
是的,当你将两个概念结合起来时,这是有效的:
这会将主机名拉入DUDE的ENV值,使每个容器成为它运行的主机:
version: '3.4'
services:
nginx:
image: nginx
environment:
DUDE: "{{.Node.Hostname}}"
deploy:
replicas: 3
答案 1 :(得分:1)
当你有很多环境变量时,我找到了另一种方法。同样的方法也适用于 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.
答案 2 :(得分:0)
如果您通过env运行docker命令,它将起作用。
env JMX_HOSTNAME="${JMX_HOSTNAME}" docker stack deploy -c docker-compose.yml mystack
贷记GitHub issue,向我指出正确的方向。