Как я могу разрешить пользователю запускать Docker приложение с разными аргументами - PullRequest
3 голосов
/ 10 июля 2020

Я создал образ Docker для моего Java приложения - https://bitbucket.org/ijabz/songkongdocker/src/master/Dockerfile

Последняя строка:

CMD /opt/songkong/songkongremote.sh

(упрощенное) содержимое songremote. sh - это

#!/bin/sh
umask 000
./jre/bin/java-jar lib/songkong-6.9.jar -r

, и он работает нормально.

Однако у меня есть клиент, который хочет запустить songkong с параметром -m и путь

например,

#!/bin/sh
umask 000
./jre/bin/java-jar lib/songkong-6.9.jar -m /users/music
  1. Итак, есть ли способ, которым один docker может разрешить запуск двух разных команд, или мне нужно создать другой docker.

  2. В любом случае, как разрешить пользователю / users / musi c предоставлять

Полное содержимое songkongremote немного сложнее, так как нужно передать больше параметров в Java

#! / bin / sh umask 000 ./jre/bin/java -XX: MaxRAMPercentage = 60 -XX: MetaspaceSize = 45 -Dcom.mchange.v2.log.MLog = com.mchange.v2.log.jdk14logging.Jdk14MLog -Dorg.jboss.logging.provider = jdk -D java .util.logging.config .class = com.jthink.songkong.logging.StandardLogging - Dhttps.protocols = TLSv1.1, TLSv1.2 --add-opens java .base / java .lang = ALL-UNNAMED -jar lib / songkong-6.9.jar -r

Обновление Я следую за ответом каскадеров, и он что-то сделал (см. Команду выполнения)

введите описание изображения здесь

но songkong. sh действует так, как если бы параметры не были переданы вообще (вместо параметра -r).

songkong. sh (переименовано из songkongremote. sh) теперь содержит

#!/bin/sh
umask 000
./jre/bin/java  -XX:MaxRAMPercentage=60 -XX:MetaspaceSize=45 -Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog -Dorg.jboss.logging.provider=jdk -Djava.util.logging.config.class=com.jthink.songkong.logging.StandardLogging -Dhttps.protocols=TLSv1.1,TLSv1.2 --add-opens java.base/java.lang=ALL-UNNAMED -jar lib/songkong-6.10.jar "$@"

, а конец файла Dockerfile теперь

EXPOSE 4567

ENTRYPOINT ["/sbin/tini"]

# Config, License, Logs, Reports and Internal Database
VOLUME /songkong

# Music folder should be mounted here
VOLUME /music

WORKDIR /opt/songkong

ENTRYPOINT /opt/songkong/songkong.sh
CMD ["-r"]

Я не понимаю, хорошо, что есть две точки входа или значение sbin / tini one

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Так есть ли способ, которым одна docker может позволить запускать две разные команды, или мне нужно создать другую docker.

Да, вы можете обработайте это, используя единую базу Dockerfile по команде с помощью точки входа.

точка входа. sh

#!/bin/sh
umask 000
if [ "$1" == "-m" ];then
    echo "starting container with -m option"
    ./jre/bin/java-jar lib/songkong-6.9.jar "$@"
else
    ./jre/bin/java-jar lib/songkong-6.9.jar -r
fi

, поэтому, если команда docker run выглядит так:

docker run -it --rm myimage -m /users/music

он выполнит первое условие

Но if [ "$1" == "-m" ] это сломается, если пользователь передаст как "-m /users/music" в двойных кавычках, поскольку условие проверяет только первый аргумент. вы можете настроить это соответствующим образом.

Таким образом, Dockerfile будет содержать только точку входа

ENTRYPOINT ["/opt/songkong/songkongremote.sh"]

Или вы можете CMD указать в Dockerfile

ENTRYPOINT ["/opt/songkong/songkongremote.sh"]
CMD ["-m", "/song/myfile]"

update :

Вы не можете определить две точки входа на изображение docker, первая будет проигнорирована.

Теперь, чтобы обработать аргумент из CMD, вы должны использовать синтаксис типа массива, иначе он будет казаться пустым

ENTRYPOINT ["/opt/songkong/songkong.sh"]
CMD ["-r"]
1 голос
/ 10 июля 2020

Вы можете попробовать использовать ENTRY точку для команды и CMD только для аргументов

ENTRYPOINT ["/sbin/tini", "/opt/songkong/songkongremote.sh" ]

CMD [] # Arguments are passed here

Вам также необходимо обработать аргументы в вашем. sh файле:

#!/bin/sh
umask 000
./jre/bin/java-jar lib/songkong-6.9.jar "$@"
0 голосов
/ 10 июля 2020

Вы можете переключиться на ENTRYPOINT вместо CMD. Ваш файл docker будет выглядеть так:

...
ENTRYPOINT [ "/opt/songkong/songkongremote.sh" ]
...

Ваши клиенты будут запускать ваше изображение как:

docker run img -r

или

docker run img -m /users/music

Вы даже можете изменить свой bash сценарий, чтобы он принимал аргументы и передавал эти аргументы тем же методом.

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

Dockerfile:

...
ENTRYPOINT [ "/opt/songkong/songkongremote.sh" ]
CMD ["-r"]
...

Ваш измененный сценарий:

#!/bin/sh 
umask 000 
./jre/bin/java \
-XX:MaxRAMPercentage=60 \
-XX:MetaspaceSize=45 \
-Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog \
-Dorg.jboss.logging.provider=jdk \
-Djava.util.logging.config.class=com.jthink.songkong.logging.StandardLogging \
-Dhttps.protocols=TLSv1.1,TLSv1.2 \
--add-opens java.base/java.lang=ALL-UNNAMED \
-jar lib/songkong-6.9.jar "$@"

Затем, когда клиенты запускают docker run img параметр CMD сработает, но при запуске docker run img -m /users/music команда точки входа будет выполнена с предоставленными аргументами.

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