簡體   English   中英

如何允許用戶使用不同的 arguments 運行 Docker 應用程序

[英]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
  1. 那么有沒有辦法一個 docker 可以允許運行兩個不同的命令,或者我必須構建另一個 docker。

  2. 無論哪種方式,我如何允許 /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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM