在bash数组中为docker命令循环参数?

时间:2017-10-01 19:32:01

标签: bash shell docker scripting

我似乎被困在这里。我试图编写一个启动x个泊坞容器的bash函数,希望一个数组能够保存给定应用程序的暴露端口。我不想循环遍历数组,只是命令,同时引用数组来获取值。该函数如下所示:

#!/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循环被错误地声明...可能会使用一些指针。

2 个答案:

答案 0 :(得分:1)

这一行:

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)如果它发现至少一个匹配的行或失败(非零退出状态),否则。

答案 1 :(得分: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而不是每个匹配容器的一堆标题和列式输出)。