当前位置: 首页 > 知识库问答 >
问题:

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

轩辕晔
2023-03-14

我为我的Java应用程序构建了一个Docker映像——https://bit bucket . org/ijabz/songkongdocker/src/master/Docker file

最后一行是

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。

    无论哪种方式,我如何允许/用户/音乐由用户提供

    songkongremote的全部内容稍微复杂一些,因为更多的选项必须传递给Java

    #!/bin/sh umask 000。/JRE/bin/Java-XX:MaxRAMPercentage = 60-XX:metaspace size = 45-DCOM . m change . v2 . log . mlog = com . m change . v2 . log . JDK 14 logging . JDK 14 mlog-dorg . JBoss . logging . provider = JDK-DJ ava . util . logging . config . class = com . jthink . songkong . logging . standard logging-dhttps . protocols = tlsv 1.1,tlsv 1.2-add-opens java.base/java.lang=ALL-UNNAMED-jar lib/

    更新I遵循级联答案,它已经做了一些事情(看看执行命令)

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

  • 共有3个答案

    齐典
    2023-03-14

    您可以切换到入口点而不是CMD。您的泊坞窗文件将如下所示:

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

    然后,您的客户会将您的映像运行为:

    docker运行img-r

    或者

    Docker run img -m /用户/音乐

    您甚至可以修改bash脚本来接受参数,并使用相同的方法传递这些参数。

    如果您需要提供默认参数以及根据需要覆盖它们的能力,下面的方法将会起作用:

    Dockerfile:

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

    修改后的脚本:

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

    然后,当客户运行docker run img时,CMD参数将启动,但当客户运行docker run img-m/users/musicentrypoint命令时,将使用提供的参数执行。

    卫沈义
    2023-03-14

    您可以尝试对命令使用< code>ENTRY point,仅对参数使用< code>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 "$@"
    
    史鹏云
    2023-03-14

    那么,有没有办法让一个泊坞站允许运行两个不同的命令,或者我必须构建另一个 Docker。

    是的,您可以在entrypoint的帮助下使用基于命令的单个Dockerfile来处理此问题。

    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
    
    

    因此,如果泊坞站运行命令如下所示

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

    它将执行第一个条件

    但是,if[“$1”==“-m”]如果用户在双引号中传递类似“-m/users/music”>的内容,作为只检查第一个参数的条件,这将中断。您可以对此进行相应的调整。

    因此,泊坞文件将仅包含入口点

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

    或者,您可以在多克文件中指定CMD

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

    更新:

    您无法为每个 docker 映像定义两个入口点,第一个入口点将被忽略。

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

    ENTRYPOINT ["/opt/songkong/songkong.sh"]
    CMD ["-r"]
    
     类似资料:
    • 我有一个功能正常的Rails 3应用程序,它使用has_many:通过关联,而不是,因为我将其重制为Rails 4应用程序,让我从Rails 4版本中的关联模型中保存id。 这两个版本的三个相关模型是相同的。 分类.rb Question.rb 类别.rb 在这两个应用程序中,类别id都像这样传递到创建操作中 在Rails 3应用程序中,当我创建一个新问题时,它会插入问题表,然后插入分类表 在ra

    • 问题内容: 我想在gradle中定义一个任务(称为),该任务运行gradle任务,但具有的固定值。我也希望以后可以使用原始任务。 我的问题是,我无法转移清单的设置。 我累了 我以为我要通过对archiveName和manifest使用其他值来重新定义任务。 运行时会生成一个可执行的JAR文件。 运行时会生成一个jar文件。不幸的是,当尝试使用我运行程序时,出现错误消息: java -jar bui

    • 问题内容: 我们的自动化版本正在Jenkins上运行。构建本身在从属服务器上运行,并且从属服务器通过SSH执行。 我收到一个错误: 我已经尝试了到目前为止在其他帖子中看到的所有建议: 签名前立即使用安全性解锁钥匙串以解锁钥匙串。 将签名密钥移到其自己的钥匙串中。 将签名密钥移到登录密钥链中。 将签名密钥移到系统密钥链中。 手动将列表钥匙串设置为仅包含钥匙的钥匙串。 在所有情况下,我都会遇到相同的错

    • 问题内容: 我有一个在码头上运行的Jetty应用程序。我想使用本地IntelliJ调试此应用程序。我使用的是14.1版,因此我已经安装了Docker Integration插件。 在“云”下,我使用的是单击“ +”时显示的默认值。IntelliJ文档说这应该没问题。在这里 我不确定它们的用途,所以我不知道这些值是否正确。 在运行/调试配置下,我正在使用Docker部署,以及以下值: 当我尝试运行此

    • 之后,我捕获请求,其中显示客户和卖方事务都是正常的。但是,当尝试使用另一个(例如)支付时,我会出现以下错误: {“name”:“unprocessable_entity”,“details”:[{“location”:“body”,“issue”:“currency_not_supported”,“description”:“当前不支持货币代码。有关支持的货币代码列表,请参阅https://dev

    • Dockerfile文件 docker撰写。yml公司 命令 错误: 步骤6:运行systemctl start httpd。服务--- Obs:在windows 7上运行:( 有小费吗?