我发现如果我在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.
如果我使用环境定义的列表形式,也会出现同样的情况。
但是如果变量javaMemoryLimit是在.env中定义的那么扩展就可以了。我也尝试使用$$javaMemoryLimit
,然后我没有收到警告消息,但是当容器实际启动时,变量不会展开。有什么想法吗?
答案 0 :(得分:0)
这是蓄意的变量替换行为。在.env
级别仅评估docker-compose.yaml
和shell环境中的变量。否则,${javaMemoryLimit}
将扩展为空字符串。
作为旁注:更烦人的事实是,env_file:
指定的文件中没有进行任何变量替换。
也就是说,如果您执行"-Xmx$${javaMemoryLimit} -D...
,则可以进行JAVA_OPTS
的任何扩展,因为它应该在-Xmx${javaMemoryLimit} -D...
中扩展为-Xmx -D...
(而不是ENTRYPOINT
)。