【发布时间】:2018-06-17 19:55:07
【问题描述】:
我正在使用docker-maven-plugin,根据文档,我需要通过<envPropertyFile> 传递环境变量文件。所以 pom.xml 中的插件看起来像
<configuration>
<images>
<image>
<build>
...
</build>
<run>
<envPropertyFile>${project.basedir}/local/local.properties</envPropertyFile>
</run>
</image>
</images>
</configuration>
我的 local.properties 具有以下值,
TIME_COUNT=1000
REST=10
在我的 java 项目中,我将这些值读取为
System.getenv("TIME_COUNT"); #which returns null.
疑难解答:
1.当我检查容器内的环境时,我看到TIME_COUNT=1000 and REST=10。
docker exec -it CONTAINER_ID bash
env
2.当我执行时
docker inspect -f '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' CONTAINER_ID
我看到所有 env 值(即 TIME_COUNT=1000, REST=10)
3.在我的 java 中,当我尝试检索所有 env 时,我没有从 local.properties 或默认值中获取任何 env 值,我可以通过执行 env 在容器内看到。
StringBuilder sb = new StringBuilder();
Map<String, String> env = System.getenv();
for (String key : env.keySet()) {
sb.append(key + ": " + env.get(key) + "\n");
}
System.out.println(sb.toString());
4.我也尝试过传递 env 变量,如下所述,它覆盖了容器中的值,但 jar 文件仍然抛出 null。
docker exec -e TIME_COUNT=12 -it CONTAINER_ID bash
【问题讨论】:
-
我的猜测是您需要使用“-D”选项将这些变量传递给您的 Java 程序。可能是这样的:ENTRYPOINT [ "java","-DTIME_COUNT=${env.TIME_COUNT}","-jar","yourjar.jar" ]
-
但容器确实具有所有
env属性。为什么一定要再过一遍? -
是的,但是除非你从命令行传递它们,否则 JVM 很可能不会看到。
-
-DTIME_COUNT=${env.TIME_COUNT}或-DTIME_COUNT=$TIME_COUNT打印空值。但如果我通过硬编码值它工作正常。 -
@tsolakp 那不是环境变量,而是系统属性。相似但不一样。
标签: java maven docker docker-container docker-maven-plugin