我似乎被困在这里。我试图编写一个启动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循环被错误地声明...可能会使用一些指针。
答案 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而不是每个匹配容器的一堆标题和列式输出)。