如何在每次重新启动之间暂停的情况下重新启动所有Docker容器?

6l7fqoea  于 2022-11-22  发布在  Docker
关注(0)|答案(1)|浏览(159)

我想暂停一下(也许只是sleep?),因为在这个服务器上有很多容器,让它减慢重新启动的速度将意味着减少负载峰值。如果可能的话,我希望将它保留为一个行程序,我知道如何把sleep放到bash脚本的for循环中,但我不知道如何把它放到这个文件中。$()部分叫什么?

docker restart $(docker ps --format "{{.Names}}" | grep -v somename)

因此,我只想列出正在运行的容器,并重新启动每个容器,每次重新启动之间可能有30秒的停顿。

pgpifvop

pgpifvop1#

根据here$()的含义为:
语法是令牌级的,因此美元符号的含义取决于它所在的令牌。表达式$(command)是command的现代同义词,它代表命令替换;意思是,运行命令并把它输出放在这里
要在暂停后执行所有重新启动,您需要在$(docker ps --format "{{.Names}}" | grep -v somename)"命令中的行上执行一个循环,在循环内执行docker restart $line命令,然后执行sleep 30命令(持续30秒)。
大概是这样的:

items=$(docker ps --format "{{.Names}}" | grep -v somename)
for word in $items
do
    docker restart $word
    sleep 30
done

说明:

items=$(docker ps --format "{{.Names}}" | grep -v somename)

这一行设置一个名为items的字符串变量,它包含所有用空格分隔的容器名称,就像您在原始命令中所做的那样。

for word in $items

会自动以空格分隔字串,在for循环的每次反覆运算中提供不同的容器名称。
介于

do

done

我们有一段代码,它对items字符串中的每个单词执行,如下所示

docker restart $word

我们像您一样重新启动Docker容器,但仅针对其中一个容器,其名称从$word读取。

sleep 30

我们休眠30秒,然后再次迭代下一个$word值。

单线版本

如果您需要一个可以作为单行运行的精简版本,可以执行以下操作:

items=$(docker ps --format "{{.Names}}" | grep -v somename);for word in $items; do;  docker restart $word; sleep 30; done;

相关问题