我发现如果我在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/

10-12 23:38