Docker - передать переменную env для замены максимальной памяти Java - PullRequest
0 голосов
/ 02 октября 2019

У меня есть Dockerfile следующим образом.

ENV SPRING_ENV="local"
ENV APP_OPTS "-Xmx8144m"
RUN echo "/usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS}  -Djava.security.egd=file:/dev/./urandom -jar  /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties  -Dspring.profiles.active=${SPRING_ENV} &" > /apps/demo/entrypoint.sh
RUN chmod +x /apps/demo/entrypoint.sh

Когда я запускаю dockerfile, я вижу файл 'entrypoint.sh' с командой java, которую я указал в Dockerfile.

Но я хочу изменить максимальную память Java в зависимости от среды. Итак, я работаю так.

docker run  -it <image_id> sh  -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev"

Но когда я запускаю его, я проверяю entrypoint.sh, я не вижу замененных переменных среды. Я что-то упустил?

Заменяет ли это только на лету, когда я действительно запускаю контейнер?

Ответы [ 3 ]

0 голосов
/ 02 октября 2019

Dockerfile (и команда RUN) выполняются только при создании образа. SPRING_ENV и APP_UMPFE_OPTS оцениваются только один раз и во время сборки.

При запуске образа --env=KEY=VALUE передается в оболочку (!), Выполняющую процесс, определенный в ENTRYPOINTили CMD (который вам нужен, но не имеет).

Вы пропускаете оператор FROM ... в верхней части Dockerfile.

Вам необходимо определить (рекомендоватьформа оболочки) ENTRYPOINT, которая вызывает среду выполнения Java, передает переменные среды и запускает ваш код, возможно (еще не пробовал):

FROM ???
ENV SPRING_ENV="local"
ENV APP_OPTS "-Xmx8144m"
ENTRYPOINT /usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties -Dspring.profiles.active=${SPRING_ENV}

Пример:

FROM busybox
ENV DOG=Freddie
ENTRYPOINT echo ${DOG}

Тогда:

docker build --tag=58208029 --file=./Dockerfile .
docker run -it 58208029:latest
Freddie

docker run -it --env=DOG=Henry 58208029:latest
Henry

HTH!

0 голосов
/ 02 октября 2019

entrypoint.sh записывается при построении образа, поэтому оператор RUN не будет выполнен снова при запуске контейнера. Таким образом, сам файл entrypoint.sh не будет обновлен.

Другая проблема заключается в том, что при запуске docker параметры -e должны находиться перед именем образа и командой:

docker run  -it -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev" <image_id> sh  

В противном случае они просто передаются в качестве аргументов точке входа / команде

Кроме того, в вашем Dockerfile вы, вероятно, захотите использовать одинарные кавычки вокруг скрипта точки входа, чтобы он не интерполировал значения во время сборки.

RUN echo '/usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS}  -Djava.security.egd=file:/dev/./urandom -jar  /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties  -Dspring.profiles.active=${SPRING_ENV} &' > /apps/demo/entrypoint.sh

Затем при запуске контейнера сценарий точки входа должен прочитать значения переменных во время выполнения из среды.

0 голосов
/ 02 октября 2019

Вам нужно экранировать $ в ${APP_OPTS} (т.е. изменить его на \${APP_OPTS}) - во время docker build переменная заменяется на «текущую» переменную окружения, которая будет равнав вашем env выводе (иначе ноль). Вызов docker run ... -e "APP_OPTS=-Xmx9144m" на этом этапе ничего не сделает, потому что ${APP_OPTS} был заменен после создания образа.

В противном случае, вы можете попробовать сохранить файл entrypoint.sh и поместить его в ту же папку, что иваш Dockerfile вместо того, чтобы ваш Dockerfile создал его (и вместо этого используйте COPY, чтобы поместить его туда, где вы хотите). Таким образом, переменная окружения ${APP_OPTS} не будет заменена во время docker build

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...