我为我的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的意义
您可以切换到入口点
而不是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/music
entrypoint命令时,将使用提供的参数执行。
您可以尝试对命令使用< 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 "$@"
那么,有没有办法让一个泊坞站允许运行两个不同的命令,或者我必须构建另一个 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上运行:( 有小费吗?