Dockerfile консольного приложения, принимающего аргументы в стиле Commons CLI - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть консольное приложение 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 ]

0 голосов
/ 14 декабря 2018

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

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}" ]

Дайте мне знать, если у вас есть какие-либо вопросы

0 голосов
/ 14 декабря 2018

Аргументы, которые вы передаете 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
...