我有一個帶有入口的dockerfile,像這樣:
我有一個帶有入口的dockerfile。
ENTRYPOINT /opt/my_applicatitons/entry.sh "${URL_1}"/span>
"${URL_2}"。
"${URL_3}"。
"${DATETIME}"。
"${ID}"。
"${URL_4}"。
"${URL_5}"。
"${S}"。
"${S1}"。
"${I}"。
"${URL_6}" /opt/my_applications/app.py
這是我的bash腳本,它是墨守成規的
。#!/bin/sh
EVENT_BODY='{"param1": "'"$1"'", "param2": "'"$2"', "param3": "'"$3"', "param4": "'"$4"', "param5": "'"$5"", "param6": "'"$6"'", "param7": "'"$7"'", "param8": "'"$8"', "param9": "'"$9"'", "param10": "'"${10}"'", "param11": "'"${11}"'"}'
echo $EVENT_BODY
exec ${12} -e "${EVENT_BODY}"/span>
基本上,我使用bash腳本來獲取所有的引數,并構建一個JSON,作為一個引數傳遞給我的python應用程式。我想找到一個更優雅的方法,因為字串EVENT_BODY是不可讀的。我試著在不同的位置(單引號后、雙引號后)使用(就像我在dockerfile中做的那樣)來斷開這一行,但都不奏效。有什么想法嗎?
uj5u.com熱心網友回復:
你能把app.py改成接受命令列上的引數,或從環境中獲取引數嗎?JSON輸入并沒有做任何有用的事情,它只是一個帶有通用param1, param2等鍵的平面字典。
命令列
擺脫ENTRYPOINT,使用CMD。
CMD /opt/my_applications/app.py
"$URL_1"/span>
"$URL_2"。
"$URL_3"。
"$DATETIME"。
"$ID"。
"$URL_4"/span>
"$URL_5"。
"$S"/span>
"$S1"/span>
"$I"。
"$URL_6"。
在Python中,訪問sys.argv中的引數:
url1 = sys.argv[0]
url2 = sys.argv[1]
url3 = sys.argv[2]
...
(或者更好的是,使用一個命令列分析器,如argparse。)
環境
在Docker檔案中設定環境變數。擺脫ENTRYPOINT,直接使用CMD:
ENV URL_1=...
ENV URL_2=...
ENV URL_3=...
...
CMD /opt/my_applications/app.py -e "$EVENT_BODY"
在Python中,從os.environ訪問變數。
url1 = os.environ['URL_1']
url2 = os.environ['URL_2']
url3 = os.environ['URL_3']
...
uj5u.com熱心網友回復:
字串可以跨越多行。不需要反斜線或任何其他轉義。
直接插值(不安全)
# Unsafe! 見下文。
EVENT_BODY="{
"param1": "$1" 。
"param2": "$2"。
"param3": "$3"。
"param4": "$4"。
"param5": "$5"。
"param6": "$6"。
"param7": "$7"。
"param8": "$8"。
"param9": "$9"。
"param10": "${10}"。
"param11": "${11}"
}"
你應該知道,直接在JSON中插值變數是容易出錯的,而且有潛在的危險。與SQL注入一樣,如果引數有特殊字符,如嵌入引號或反斜線,這很容易被破壞。
最好的情況是,他們將創建無法決議的無效 JSON。最壞的情況是,如果這些引數是由外部提供的,狡猾的黑客可以提供一個值,如$8 = param8 value", "param7": "overridden value。這將導致第二個param7鍵被添加。一些JSON決議器將拒絕重復的鍵,但有些將決議它并可能覆寫預期的param7值。
演示:
$ ./entry.sh a b c d e f g 'h": "param7", "hacked' i j k l
{
"param1"/span>: "a",
"param2": "b",
"param3": "c",
"param4": "d",
"param5": "e",
"param6": "f",
"param7": "g",
"param8": "h", "param7": "hacked",
"param9": "i",
"param10": "j",
"param11": "k".
}
JQ (safe)
在shell腳本中生成JSON的一個更好的方法是使用JQ,一個輕量級和靈活的命令列JSON決議器。它知道如何轉義特殊字符并防止JSON注入攻擊。EVENT_BODY="$(jq -n
--arg param1 "$1"/span> --arg param2 "$2"/span> --arg param3 "$3 變數">$3" --arg param4 "$4"-- arg param5 "$5" --arg param6 "$6" --arg param7 "$7" --arg param8 "$8" --arg param9 "$8" string">"$9" --arg param10 "${10}" --arg param11 "${11}"
'{"param1"/span>: $param1, "param2"/span>: $param2, "param3"/span>: $param3, "param4"/span>: $param4, "param5"/span>: $param5, "param6"/span>: $param6, "param7"/span>: $param7, "param8"/span>: $param8, "param9"/span>: $param9, "param10"/span>: $param10, "param11"/span>: $param11}'
)"
echo "$EVENT_BODY"
演示:
{
"param1"/span>: "a",
"param2": "b",
"param3": "c",
"param4": "d",
"param5": "e",
"param6": "f",
"param7": "g",
"param8": "h", "param7": "hacked"。
"param9": "i",
"param10": "j",
"param11": "k".
}
你可能需要在你的容器中apt-get install jq或者yum install jq來使用它 -- 值得!
uj5u.com熱心網友回復:
EVENT_BODY='{"param1": "'"$1"'", "param2": "'"$2"", "param3": "'"3"", "param4": "'"4美元"","引數5"。"'"5"'", "param6": "'"$6"'", "param7": "'"7美元"", "引數8": "'"$8"'", "param9": "'"$9"'", "param10": "'"${10}"", "param11": "'"${11}"'"}'
實際上這已經是多字串了,而不是單字串,所以你可以在任何成對的單引號之后進行分割,像這樣:
EVENT_BODY='{"param1": "'/span>"$1"
'", "param2": "'"$2">
'", "param3": "'
"$3"
'", "param4": "'"$4">
'", "param5": "'"$5">
'", "param6": "'"$6"
'", "param7": "'"$7"
'", "param8": "'"$8"
'", "param9": "'"$9">
'", "param10": "'"${10}"
'", "param11": "'"${11}"
'"}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324976.html
標籤:
上一篇:我如何為別名添加一個標志?
