我已经为我的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
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的重要性 最佳答案
是的,您可以在入口点的帮助下使用单个基于Dockerfile的命令来处理此问题。
入口点
#!/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"]