Как я могу обновить переменную в моем dockerfile, основываясь на значении другой переменной? - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно обновить переменную JAVA_ARGS, прежде чем отправить ее в команду java -server.

Когда пользователь вызывает ./script/server -d, я хочу добавить аргументы отладки.Вот соответствующая часть моего ./script/server:

for i in "$@"
do
case $i in
    -d|--debug)
    DEBUG_ARGS="--build-arg DEBUG_MODE=true"
    shift
    ;;
    -h|--help)
    display_usage
    exit
    ;;
    *)
    echo "Unknown option"
    exit 1
    ;;
esac
done

docker-compose build ${DEBUG_ARGS} app
docker-compose up

Вот фрагмент из моего docker-compose.yml

services:
  app:
    environment:
      ...
      JAVA_ARGS: -Xms2048m -Xmx3072m
      JAVA_ARGS_DEBUG: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5080

Это похоже на работу, и я думаю, что мой dockerfileправильно определить переменную DEBUG_MODE=true.Вот мой dockerfile: (некоторые вещи удалены)

FROM openjdk:8-alpine

ARG DEBUG_MODE=false
ENV DEBUG_MODE ${DEBUG_MODE}

ARG JAVA_ARGS=
ENV JAVA_ARGS ${JAVA_ARGS}    

RUN if [ $DEBUG_MODE == "true" ]; \
        then echo "Debug mode on."; JAVA_ARGS=$JAVA_ARGS $JAVA_ARGS_DEBUG; \
        else echo "Debug mode off."; \
    fi;

RUN echo "Echoing JAVA_ARGS: "; \
    echo "${JAVA_ARGS}";

ENTRYPOINT ["/docker-entrypoint.sh"]
CMD java -server ${JAVA_ARGS} -jar /app/app.jar

Я правильно вижу Debug mode on. вывод на консоль.

Но тогда echo "${JAVA_ARGS}"; пусто.И действительно, когда дело доходит до последней строки, аргументы не передаются команде java, и отладка не включена.

Мой bash довольно шаток, знаете, почему я нев состоянии обновить и использовать эту переменную в последней команде?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы должны сделать эти параметры настраиваемыми во время выполнения, а не пытаться «запекать» настройки в образ Docker.(Если образ имеет жестко запрограммированный размер кучи 3 ГБ, могу ли я запустить его в системе с 1 ГБ ОЗУ? Или 64 ГБ?)

Ваш файл Dockerfile намекает на сценарий ENTRYPOINT, и это хорошоместо, чтобы поставить настройки, как это.Мы можем урезать Dockerfile до:

FROM openjdk:8-alpine
WORKDIR /app
COPY app.jar docker-entrypoint.sh ./
ENTRYPOINT "/app/docker-entrypoint.sh"
CMD ["java", "-jar", "app.jar"]

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

#!/bin/sh
if [ -n "$JAVA_OPTS" ]; then
  JAVA_OPTS="-Xms2048m -Xmx3072m"
fi
if [ -n "$DEBUG_MODE" ]; then
  JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5080"
fi
export JAVA_OPTS
exec "$@"

И затем запустить его:

docker run --rm -p127.0.0.1:5080:5080 -e DEBUG_MODE=yes myimage

Вы бы запустили тот же образ «для отладки» или «для реального»;вам не нужно перекомпилировать его или принимать docker build временные решения о том, как устанавливать переменные.

...