docker compose环境变量用于命令

时间:2016-11-06 07:34:49

标签: docker-compose

通过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

但无法让它发挥作用。有什么方向吗?

2 个答案:

答案 0 :(得分:16)

解析文件时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/#variable-substitution

答案 1 :(得分:0)

转义$以便变量不会立即被替换,而是稍后在容器环境中是窍门,就像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"