【问题标题】:Reading environment variable in jar from docker container从 docker 容器中读取 jar 中的环境变量
【发布时间】: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


【解决方案1】:

cron 加载它自己的环境变量,解决方法是将env 从容器加载到文件,然后在调用 jar 文件之前导出该文件。

Dockerfile:

...
#call start.sh to environment variable for cron
CMD /bin/bash /opt/project_dump/start.sh

start.sh:

# export all environment variables but `no_proxy` to use in cron.
# Note: no_proxy throws error while exporting due to formatting, envs.sh is created with export environment variables.
env | sed '/no_proxy/d' | sed 's/^\(.*\)$/export \1/g' > /root/envs.sh
chmod +x /root/envs.sh

# Run the cron command on container startup in foreground.
# Note: -n (foreground) keeps the container running instead of exiting once the crond is ran.
crond -n

执行.sh:

#!/bin/bash
/usr/lib/jvm/default-java/bin/java -jar /opt/project_dump/project_name.jar
#emptyline

crontab.txt:

#!/bin/bash
#calls environment script, execute script to call jar
*  *  * * *  root . /root/envs.sh;/opt/project_dump/execute.sh
#emptyline

参考:
1.https://github.com/citta-lab/docker/tree/master/dockerCron
2.http://dev.im-bot.com/docker-cron/

【讨论】:

    猜你喜欢
    • 2016-03-07
    • 1970-01-01
    • 2016-05-30
    • 2017-12-24
    • 2020-07-24
    • 2021-09-30
    • 1970-01-01
    • 2020-07-16
    • 2017-07-16
    相关资源
    最近更新 更多