组合环境中的Docker变量扩展

时间:2018-01-11 15:57:50

标签: docker docker-compose

我发现如果我在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,然后我没有收到警告消息,但是当容器实际启动时,变量不会展开。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是蓄意的变量替换行为。在.env级别仅评估docker-compose.yaml和shell环境中的变量。否则,${javaMemoryLimit}将扩展为空字符串。

作为旁注:更烦人的事实是,env_file:指定的文件中没有进行任何变量替换。

也就是说,如果您执行"-Xmx$${javaMemoryLimit} -D...,则可以进行JAVA_OPTS的任何扩展,因为它应该在-Xmx${javaMemoryLimit} -D...中扩展为-Xmx -D...(而不是ENTRYPOINT)。

相关问题