如何重启所有 docker 容器并在每次重启之间暂停?

How do I restart all docker containers with a pause between each restart?

我想暂停一下(也许只是 sleep 以某种方式?)在每个 restart 之间的这个班轮中,因为此服务器上有很多容器并且速度变慢重新启动将意味着更少的负载峰值。如果可能的话,我想将其保留为一行,并避免将其放入 bash shell 脚本文件中。我知道如何将 sleep 放入 bash 脚本的 for 循环中,但我不知道如何将其放入其中。 $() 部分叫什么?

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

所以我只想列出 运行 个容器,并在每次重启之间暂停 30 秒重新启动每个容器。

根据here$()的含义是:

The syntax is token-level, so the meaning of the dollar sign depends on the token it's in. The expression $(command) is a modern synonym for command which stands for command substitution; it means, run command and put its output here.

执行所有重新启动然后暂停所需的是循环遍历 $(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 $world

我们像您一样重新启动 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;