簡體   English   中英

在bash數組中循環使用docker命令的參數?

[英]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.

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