我发现,如果我在docker-compose服务条目中覆盖图像的入口点,它会忽略环境部分中定义的变量,但会从环境文件中读取它们,例如
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
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然后,变量会按预期展开。
发布于 2018-01-10 22:45:57
在compose environment部分中定义的变量被传递给容器,但docker-compose本身并不使用它来解析您的yml文件。yml文件中的变量根据主机外壳的环境(从中运行docker-compose up命令的外壳)和/或.env文件内容展开。
由于您正在使用外壳语法运行入口点,因此您可以通过转义变量,让容器内的外壳展开变量,而不是让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\""https://stackoverflow.com/questions/48184700
复制相似问题