docker compose环境变量用于命令

f-z*_*z-N 12 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
Run Code Online (Sandbox Code Playgroud)

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

          #!/bin/sh
          export JAVA_HOME="/usr/java/latest/"
          exec $JAVA_HOME/bin/java $@
Run Code Online (Sandbox Code Playgroud)

我需要在运行时将值传递给命令,因为我可以将我的图像用于许多其他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.
Run Code Online (Sandbox Code Playgroud)

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

Docker Compose - 使用容器环境变量的命令

Docker-compose环境变量

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

dne*_*hin 21

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

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

-Dconfig.home=$${CONF_HOME} -Dcomponent.name=LMS -Denv=$${APP_ENV} -Duser.dir=/tmp/ -DLMS_UUID=$${UUID
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这对我不起作用。当我使用 $${VAR_NAME} 时,回显 var 时的值是 $VAR_NAME (15认同)
  • `sh -c "echo $$FOO"` 对我有用,/sf/answers/3251929761/ (5认同)
  • 它对我也不起作用。文本 $VARIABLE 被传递给命令,并且它不会在容器内扩展。 (4认同)
  • 该解决方案不再有效。 (2认同)
  • 截至 2023 年 4 月,此处所述的所有方法似乎都不适用于 Docker。有人找到了当前有效的解决方案吗? (2认同)
  • 我从github上看到了这个问题,它对我有用:https://github.com/docker/compose/issues/9757#issuecomment-1217460695 (2认同)

Dev*_*laN 5

这是特定于语法的,尽管其他答案中有说明,但我无法正确运行它,直到通过以下试验和错误发现:

\n
version: "3.9"\nservices:\n  test-vars-service:\n    image: alpine\n    environment:\n      VAR_ONE: "Hello"\n      VAR_TWO: "World"\n    command: sh -c 'echo "$$VAR_ONE $$VAR_TWO"'\n
Run Code Online (Sandbox Code Playgroud)\n

这导致:

\n
[+] Running 1/0\n \xe2\x9c\x94 Container var-test-test-vars-service-1  Created                                                                                                                           0.0s \nAttaching to var-test-test-vars-service-1\nvar-test-test-vars-service-1  | Hello World\nvar-test-test-vars-service-1 exited with code 0\n
Run Code Online (Sandbox Code Playgroud)\n