gpt4 book ai didi

java - 如何允许用户使用不同的参数运行 Docker 应用程序

转载 作者:行者123 更新时间:2023-12-01 14:26:24 25 4
gpt4 key购买 nike

我已经为我的 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掩码 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 的回答,它做了一些事情(查看执行命令)

enter image description here

但是 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 一个的重要性

最佳答案

So is there a way a single docker can allow for two different commandto be run, or do I have to build another 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]"

更新:

您不能为每个 docker 镜像定义两个入口点,第一个将被忽略。

现在要处理来自 CMD 的参数,你应该使用数组类型语法,否则它看起来是空的

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

关于java - 如何允许用户使用不同的参数运行 Docker 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62830762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com