【问题标题】:docker compose environment variable for commanddocker compose 命令的环境变量
【发布时间】:2016-11-06 07:34:48
【问题描述】:

我在通过 compose 命令选项将环境变量传递给我的自定义图像时遇到问题:

我的撰写文件:

---

version: '2'
services:
myservice:
  image: mycustomimage_lms
  environment:
    CONF_HOME: /opt/apps-java/
    APP_ENV: dev
    UUID: me1
  command: -Dconfig.home=${CONF_HOME} -Dcomponent.name=LMS -Denv=${APP_ENV} -Duser.dir=/tmp/ -DLMS_UUID=${UUID} -jar /opt/apps-java/my.jar
  ports:
    - "9060"
  volumes:
    - ./:/opt/apps-java/
    - ./:/var/logs/apps-logs/
    - ./:/tmp/data

我的图像只是一个自定义 jre 图像,它的入口点设置为接受 jvm 参数的 shell 脚本。我从 enrtypoint 调用的 run.sh

#!/bin/sh
export JAVA_HOME="/usr/java/latest/"
exec $JAVA_HOME/bin/java $@

我需要在运行时将值传递给命令,因为我可以将我的图像用于许多其他 jar,并且只需将参数更改为我的图像。

这是我得到的:

 $> docker-compose up
 WARNING: The CONF_HOME variable is not set. Defaulting to a blank string.
 WARNING: The APP_ENV variable is not set. Defaulting to a blank string.
 WARNING: The UUID variable is not set. Defaulting to a blank string.

我也有 经历了几个答案,例如:

Docker Compose - Command using Container Environment Variable

Docker-compose environment variables

但无法正常工作。请问有什么方向吗?

【问题讨论】:

    标签: docker-compose


    【解决方案1】:

    在解析文件时,Compose 正在读取变量。但是设置environment 只为容器提供值,而不是文件解析。

    如果您尝试将这些变量传递到容器中,则需要在命令中使用额外的 $ 转义它们

    -Dconfig.home=$${CONF_HOME} -Dcomponent.name=LMS -Denv=$${APP_ENV} -Duser.dir=/tmp/ -DLMS_UUID=$${UUID
    

    如果您只是想在 Compose 文件中使用变量,则需要将这些变量放入 .env 文件中。

    有关完整文档,请参阅 https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution

    【讨论】:

    • 太棒了。谢谢。虽然我使用了 .evn,但我希望这些值包含在 compose 中,您的建议为我做到了。
    • 这对我不起作用。当我使用 $${VAR_NAME} 时,回显该 var 时的值为 $VAR_NAME
    • 您的意思是“额外”吗?在您链接的页面上,我没有看到任何有关 $$ 的文档。也许 docker 已经移动了文档。
    • 它也对我不起作用。将文字 $VARIABLE 传递给命令,它不会在容器内展开。
    • sh -c "echo $$FOO" 为我工作,stackoverflow.com/a/46456139/5760975
    【解决方案2】:

    转义 $ 以便变量不会立即被替换,而是稍后在容器环境中替换是诀窍,就像 docker-compose.yml 中接受的答案一样。

    我只是想补充一点,如果您将命令传递给 docker-compose 调用,您需要转义 shell 中的字符,即使用 \

    docker-compose run --rm myservice "-Dconfig.home=\${CONF_HOME} -Dcomponent.name=LMS -Denv=\${APP_ENV} -Duser.dir=/tmp/ -DLMS_UUID=\${UUID} -jar /opt/apps-java/my.jar"
    

    【讨论】:

    • 不适用于 OP 要求的撰写文件
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2022-01-01
    • 2018-02-03
    • 2019-02-25
    相关资源
    最近更新 更多