Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I allow user to run Docker application with different arguments

Tags:

java

docker

I have built a Docker image for my Java application - https://bitbucket.org/ijabz/songkongdocker/src/master/Dockerfile

The last line is

CMD /opt/songkong/songkongremote.sh

the (simplified) contents of songremote.sh are

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

and it works fine.

However I have a customer who wants to run songkong with the -m option and a path

e.g

#!/bin/sh
umask 000
./jre/bin/java-jar lib/songkong-6.9.jar -m /users/music
  1. So is there a way a single docker can allow for two different command to be run, or do I have to build another docker.

  2. Either way how do I allow /users/music to be provided by user

The full contents of songkongremote are a bit more complicated, since more options have to be passed to 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 -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 -r

Update I follows Cascaders answer and it has done something (look at Execution Command)

enter image description here

but songkong.sh is acting as if no parameters have been passed at all (rather than -r option passed).

songkong.sh (renamed from songkongremote.sh) now contains

#!/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 "$@"

and the end of Dockerfile is now

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

I don't understand if okay that there are two entrypoints or the signifcance of the sbin/tini one

like image 831
Paul Taylor Avatar asked Dec 18 '25 11:12

Paul Taylor


1 Answers

So is there a way a single docker can allow for two different command to be run, or do I have to build another docker.

Yes, you can handle this using single Dockerfile base on command with help of entrypoint.

entrypoint.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

so if the docker run command look like this

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

it will execute first condition

But if [ "$1" == "-m" ] this will break if user pass like "-m /users/music" in double-quotes, as the condition only checking for first argument. you can adjust this accordingly.

So the Dockerfile will only contain entrypoint

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

Or you can CMD specify in Dockerfile

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

update:

You can not define two entrypoint per docker image, the first will be ignore.

Now to process to argument from CMD you should use array type syntax otherwise it will seems empty

ENTRYPOINT ["/opt/songkong/songkong.sh"]
CMD ["-r"]
like image 76
Adiii Avatar answered Dec 20 '25 01:12

Adiii



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!