Чтение переменной среды в jar из контейнера Docker
Я использую 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. Когда я проверяю env внутри контейнера, я вижу 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, я не получаю ни одно из значений env из local.properties или по умолчанию, которое я мог видеть внутри контейнера, выполнив 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 по-прежнему выбрасывал ноль.
docker exec -e TIME_COUNT=12 -it CONTAINER_ID bash
1 ответ
Крон загружается с собственными переменными среды, и обходной путь должен был загрузить 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
execute.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/