首页 > 解决方案 > 如何允许用户使用不同的参数运行 Docker 应用程序

问题描述

我为我的 Java 应用程序构建了一个Docker映像 - 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

它工作正常。

但是我有一个客户想要使用 -m 选项和路径来运行 Songkong

例如

#!/bin/sh
umask 000
./jre/bin/java-jar lib/songkong-6.9.jar -m /users/music
  1. 那么有没有一种方法可以让单个 docker 允许运行两个不同的命令,或者我必须构建另一个 docker。

  2. 无论哪种方式,我如何允许 /users/music 由用户提供

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

更新 我遵循 Cascaders 的回答,它已经做了一些事情(查看执行命令)

在此处输入图像描述

但是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 之一的意义

标签: javadocker

解决方案


您可以尝试将ENTRYpoint 用于命令,并且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 "$@"

推荐阅读