撰写入口点中的 Docker 变量扩展

Kra*_*roc 3 docker dockerfile docker-compose

我发现如果我在 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
Run Code Online (Sandbox Code Playgroud)

当我这样做时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.
Run Code Online (Sandbox Code Playgroud)

但是当我在 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
Run Code Online (Sandbox Code Playgroud)

然后变量按预期扩展。

BMi*_*tch 9

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

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

entrypoint: "java $${JAVA_OPTS} -Xmx$${javaMemoryLimit} -jar /app.jar"
Run Code Online (Sandbox Code Playgroud)

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

entrypoint: "/bin/sh -c \"java $${JAVA_OPTS} -Xmx$${javaMemoryLimit} -jar /app.jar\""
Run Code Online (Sandbox Code Playgroud)