[英]Looping over arguments in bash array for docker commands?
我似乎被困在這里。 我正在嘗試編寫一個bash函數,該函數以x
個docker容器開頭,希望有一個數組可以保存給定應用程序的暴露端口。 我不想遍歷數組,而只是命令,同時引用數組以獲取值。 該函數如下所示:
#!/bin/bash
declare -a HOSTS=( ["app1"]="8002"
["app2"]="8003"
["app3"]="8008"
["app4"]="8009"
["app5"]="8004"
["app6"]="8007"
["app7"]="8006" )
start() {
for app in "$@"; do
if [ "docker ps|grep $app" == "$app" ]; then
docker stop "$app"
fi
docker run -it --rm -d --network example_example \
--workdir=/home/docker/app/src/projects/"$app" \
--volume "${PWD}"/example:/home/docker/app/src/example \
--volume "${PWD}"/projects:/home/docker/app/src/projects \
--volume "${PWD}"/docker_etc/example:/etc/example \
--volume "${PWD}"/static:/home/docker/app/src/static \
--name "$app" --hostname "$app" \
--publish "${HOSTS["$app"]}":"${HOSTS["$app"]}" \
example ./manage.py runserver 0.0.0.0:"${HOSTS[$app]}";
echo "$app"
done
}
我想這樣傳遞參數:
./script.sh start app1 app2 app4
現在,它沒有回顯應用程序,因此指向錯誤聲明的for循環...可以在此使用一些指針。
這行:
if [ "docker ps|grep $app" == "$app" ];
不會做你想要的。 您似乎要說的是:
if [ "$(docker ps | grep "$app")" == "$app" ];
但是您可能無法檢測到正在運行的應用程序的兩個副本,而且您根本不是在尋找該應用程序(因此,如果您尋找rm
您可能會發現perform
正在運行,並認為rm
正在運行)。
因此,您應該考慮使用:
if docker ps | grep -w -q "$app"
then …
fi
這將運行docker
命令和管道的結果grep
,並退出狀態報告grep
。 -w
查找包含"$app"
值的單詞,但它默默地執行( -q
),因此grep
僅在發現至少一個匹配行或失敗(非零退出)時報告成功(退出狀態0
)。狀態)。
docker ps -f
可讓您方便地以編程方式檢查特定映像是否正在運行。
for app in "$@"; do
if docker ps -q -f name="$app" | grep -q .; then
docker stop "$app"
:
不幸的是, docker ps
沒有設置退出代碼(至少沒有設置我可用的版本-我認為它已在17.06之后的某些開發版本中修復,但我不確定),因此我們必須使用丑陋的管道grep -q .
檢查命令是否產生任何輸出。 -q
標志只會最大程度地減少其打印的內容(它將僅打印容器ID,而不是每個匹配容器的一堆標題和列輸出)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.