通过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
但无法让它发挥作用。有什么方向吗?
答案 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"