gpt4 book ai didi

bash - 在bash数组中循环使用docker命令的参数?

转载 作者:行者123 更新时间:2023-12-02 20:38:44 25 4
gpt4 key购买 nike

我似乎被困在这里。我试图编写一个bash函数,该函数以docker容器的x开头,希望有一个数组可以保存给定应用程序的暴露端口。我不想遍历数组,而只是命令,同时引用数组以获取值。该函数如下所示:

#!/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)。

关于bash - 在bash数组中循环使用docker命令的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46516110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com