我发现如果我在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
然后按预期扩展变量。
答案 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\""