我已经为我的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
  • 因此,有一种方法可以使单个docker允许运行两个不同的命令,或者我必须构建另一个docker。
  • 两种方式如何允许用户提供/ 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的回答,它已经完成了一些工作(请查看执行命令)
    java - 如何允许用户使用不同的参数运行Docker应用程序-LMLPHP
    但是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"]
    

    08-25 14:36