我发现如果我在docker-compose服务条目中定义一个环境变量,它将不会在环境部分中定义的其他变量中扩展,但是如果在env文件中定义了该变量,它将被扩展。
someserver:
image: "some-server:latest"
restart: always
ports:
- "8849:8849"
environment:
javaMemoryLimit: 3056M
JAVA_OPTS: "-Xmx${javaMemoryLimit} -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=8849 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.rmi.port=8849 -Djava.rmi.server.hostname=localhost"
当我这样做
docker-compose up
时,我得到关于未设置变量的警告:WARNING: The javaMemoryLimit variable is not set. Defaulting to a blank string.
如果使用环境定义的列表形式,也会发生相同的情况。
但是,如果在.env中定义了变量javaMemoryLimit,则扩展就可以了。我也尝试过使用
$$javaMemoryLimit
,但是我没有收到警告消息,但是当容器实际启动时,变量未展开。有任何想法吗? 最佳答案
这是故意的变量替换行为。仅.env
和 shell 环境中的变量在docker-compose.yaml
级别进行评估。否则,${javaMemoryLimit}
将扩展为空字符串。
附带说明:更烦人的是,在env_file:
指定的文件中没有任何变量替换的事实。
就是说,如果您进行"-Xmx$${javaMemoryLimit} -D...
,则可以进行扩展JAVA_OPTS
的任何操作,因为它应该在-Xmx${javaMemoryLimit} -D...
中扩展为-Xmx -D...
(而不是ENTRYPOINT
)。
关于docker - 撰写环境中的Docker变量扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48211138/