组合入口点中的Docker变量扩展

时间:2018-01-10 09:58:29

标签: docker docker-compose dockerfile

我发现如果我在docker-compose服务条目中覆盖图像的ENTRYPOINT,它会忽略环境部分中定义的变量,但会从env文件中读取它们,例如:

  someserver:
    image: "some-server:latest"
    restart: always
    ports:
      - "8849:8849"
    environment:
       javaMemoryLimit: 3056M
       JAVA_OPTS: "-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"
    entrypoint: java ${JAVA_OPTS} -Xmx${javaMemoryLimit} -jar /app.jar

当我使用此docker-compose up时,我收到有关未设置变量的警告:

WARNING: The JAVA_OPTS variable is not set. Defaulting to a blank string.
WARNING: The javaMemoryLimit variable is not set. Defaulting to a blank string.

但是当我在env文件中定义变量时,例如.ENV

javaMemoryLimit=2098M
JAVA_OPTS=-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

然后按预期扩展变量。

1 个答案:

答案 0 :(得分:2)

compose environment部分中定义的变量将传递给容器,但docker-compose本身不会用来解析您的yml文件。 yml文件中的变量将使用您的主机shell环境(运行docker-compose up命令的shell)和/或.env文件内容进行扩展。

由于您使用shell语法运行入口点,因此可以通过转义变量来使容器内的shell扩展变量而不是让docker-compose执行此操作:

entrypoint: "java $${JAVA_OPTS} -Xmx$${javaMemoryLimit} -jar /app.jar"

您可能需要添加/ bin / sh来解析这些变量:

entrypoint: "/bin/sh -c \"java $${JAVA_OPTS} -Xmx$${javaMemoryLimit} -jar /app.jar\""