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

标签 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

然后变量按预期扩展。

最佳答案

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\""

关于撰写入口点中的 Docker 变量扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48184700/

相关文章:

docker - 在 ubuntu 上的 Dockerfile 中安装特定版本的 python

python - 运行相同docker命令的两台主机之间存在差异

php - Docker PHP MySQL 连接被拒绝

docker - 为什么我无法获得 docker build 创建的文件的尾部输出

docker - 为 Docker 的需求文件使用本地包

shell - 为什么我的 docker 在执行我的 shell 脚本后退出?

postgresql - 使用 docker-compose 删除命名卷?

docker - 从 docker 容器连接到 mysql 数据库

php - 使用 Docker 我得到错误 : "SQLSTATE[HY000] [2002] No such file or directory"

docker - 我可以在 Dockerfile 中引用 Dockerfile 吗?