我发现如果我在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
然后我没有得到警告信息但是当容器实际启动时变量没有被扩展。有任何想法吗?
这是故意的变量替换行为。在.env
级别仅评估来自shell环境的docker-compose.yaml
和变量。否则,${javaMemoryLimit}
将扩展为空字符串。
作为旁注:更令人讨厌的是,在env_file:
指定的文件中无变量替换。
那就是说,如果你做"-Xmx$${javaMemoryLimit} -D...
任何扩展JAVA_OPTS
可能工作,因为那应该扩展到你的-Xmx${javaMemoryLimit} -D...
-Xmx -D...
(而不是ENTRYPOINT
)。