Dockerfile консольного приложения, принимающего аргументы в стиле Commons CLI

У меня есть консольное приложение Java, которое я упаковываю как jar и запускаю как

java -jar target/myProject-1.0-SNAPSHOT.jar -arg1 145 -arg2 345 -arg3 99

Я хочу выполнить ту же команду внутри контейнера и передать эти аргументы (arg1, arg2, arg3) команде запуска docker. Мой докер файл выглядит так:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/myProject-1.0-SNAPSHOT.jar myProject-1.0-SNAPSHOT.jar
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar" ]

затем я пытаюсь запустить образ следующим образом:

docker run myProject:0.3 -e  -arg1 145 -arg2 345 -arg3 99

но моя программа не получает аргументов. чего мне не хватает?

2 ответа

Решение

Вы должны добавить команду ENV в DOCKERFILE так что вы можете получить аргументы, которые вы передаете, а затем передать его на ENTRYPOINT скрипт

Dockerfile будет выглядеть примерно так

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ENV arg1
ENV arg2
ENV arg3
ADD target/myProject-1.0-SNAPSHOT.jar myProject-1.0-SNAPSHOT.jar
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar ${arg1} ${arg2} ${arg3}" ]

Дайте знать, если у вас появятся вопросы

Аргументы, которые вы передаете docker run это команда, которую она выполняет, которую она добавляет к концу точки входа. Итак, то, что вы делаете, эквивалентно бегу:

sh -c "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar" -arg1 145 -arg2 345 -arg3 99

Представленный так, вы можете видеть, что аргументы собираются sh и не java, Если вы хотите объединить набор параметров, которые вы определяете при создании образа, с набором параметров, которые вы можете добавить во время выполнения, вам нужно будет использовать скрипт-оболочку или что-то подобное.

  1. Создайте файл wrapper.sh и сделайте его исполняемым:

    #!/bin/sh
    exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar "$@"
    
  2. Добавьте его в свой контейнер с ADD wrapper.sh /bin в Dockerfile

  3. Измените вашу точку входа на ["/bin/wrapper.sh"]
  4. Теперь, когда вы запустите изображение, оно добавит аргументы к java командная строка
Другие вопросы по тегам