我需要將可選的運行時引數傳遞給 Docker 中的命令。
這個想法是,如果在運行 docker 時設定了 PARAM env 變數 - 它應該作為 傳遞給 java 命令--key VALUE,并且當未設定運行時引數時 - 它不應該傳遞任何東西 - 特別是它不應該傳遞--key引數名稱。
PARAM即,如果設定了環境變數
,它應該運行以下命令:/bin/java -jar artifact.jar --key $PARAM
如果不是,請遵循:
/bin/java -jar artifact.jar
我想使用: 語法,但它在構建時已解決,這意味著它不會受到運行時環境變數的影響。
docker build -t test-abc . && docker run -e "PARAM=oooo" test-abc
FROM openjdk:17
ENV PARAM=${PARAM: "--key $PARAM"}
ENTRYPOINT /bin/java -jar artifact.jar $PARAM
uj5u.com熱心網友回復:
準備一個能夠正確處理引數的腳本:
#!/bin/bash
args=()
if [[ -v PARAM ]]; then
args=(--key "$PARAM")
fi
/bin/java -jar artifact.jar "${args[@]}" "$@"
并添加它:
ADD entrypoint.sh /entrypoint.sh
CMD chmod x /entrypoint.sh
ENTRYPOINT /entrypoint.sh
uj5u.com熱心網友回復:
如果您在ENTRYPOINT此處使用,并且用 JSON 陣列語法重寫它,那么您可以在docker run image-name. (從技術上講,它們取代了CMD.)
# Dockerfile: do use JSON-array syntax; do not attempt to handle options;
# must use ENTRYPOINT for "container-as-command" layout
ENTRYPOINT ["java", "-jar", "artifact.jar"]
docker run test-abc --key oooo
您也可以直接在命令字串中撰寫引數擴展。這需要您使用 shell-syntax ENTRYPOINTor CMD,因此本質上會禁止您提供您沒有以這種方式設定的額外選項。POSIX 規范支持該${VARIABLE: value}語法,因此這應該適用于所有 Linux 發行版基礎映像,即使它們不包含 bash。
ENTRYPOINT java -jar artifact.jar ${PARAM:=--key "$PARAM"}
BashFAQ/050有更多語法建議,其中一些是特定于 bash 的,但更詳細的建議確實需要對 shell 拆分和擴展有很好的理解。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527370.html
下一篇:如何使用Bash洗掉非最新影像
