[英]How can I allow user to run Docker application with different arguments
我為我的 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 Z93F725A07423FE1C88946F448B33D21F 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 之一的意義
您可以嘗試對命令使用ENTRY
點,而CMD
僅適用於 arguments
ENTRYPOINT ["/sbin/tini", "/opt/songkong/songkongremote.sh" ]
CMD [] # Arguments are passed here
您還需要在 your.sh 文件中處理 arguments :
#!/bin/sh
umask 000
./jre/bin/java-jar lib/songkong-6.9.jar "$@"
那么有沒有辦法一個 docker 可以允許運行兩個不同的命令,或者我必須構建另一個 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 運行命令看起來像這樣
docker run -it --rm myimage -m /users/music
它將執行第一個條件
但是if [ "$1" == "-m" ]
如果用戶通過雙引號中的"-m /users/music"
作為條件僅檢查第一個參數,這將中斷。 你可以相應地調整它。
所以 Dockerfile 將只包含入口點
ENTRYPOINT ["/opt/songkong/songkongremote.sh"]
或者您可以在CMD
中指定 CMD
ENTRYPOINT ["/opt/songkong/songkongremote.sh"]
CMD ["-m", "/song/myfile]"
更新:
您不能為每個 docker 映像定義兩個入口點,第一個將被忽略。
現在要處理來自CMD
的參數,您應該使用數組類型語法,否則它將看起來是空的
ENTRYPOINT ["/opt/songkong/songkong.sh"]
CMD ["-r"]
您可以切換到ENTRYPOINT
而不是CMD
。 您的 docker 文件將如下所示:
...
ENTRYPOINT [ "/opt/songkong/songkongremote.sh" ]
...
然后,您的客戶會將您的圖像運行為:
docker run img -r
或者
docker run img -m /users/music
您甚至可以更改您的 bash 腳本以接受 arguments 並使用相同的方法傳遞這些 arguments。
如果您需要提供默認 arguments並能夠按需覆蓋它們,則以下方法將起作用:
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 "$@"
Then, when customers run docker run img
the CMD parameter will kick-in, but when they run docker run img -m /users/music
the entrypoint command will be executed with the provided arguments.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.