Как перезапустить все контейнеры Docker с паузой между перезапусками? - PullRequest
0 голосов
/ 24 октября 2018

Я бы хотел поставить паузу (может быть, просто sleep как-нибудь?) В этот один вкладыш между каждым restart, потому что на этом сервере довольно много контейнеров, и если он замедлится, перезапуски будут означать меньшешип нагрузки.Если возможно, я бы хотел сохранить это в одной строке и не помещать это в файл сценария оболочки bash.Я знаю, как поместить sleep в цикл for в скрипте bash, но я не знаю, как это сделать.Как называется $() часть?

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

Так что я просто хочу составить список запущенных контейнеров и перезапустить каждый из них с паузой в 30 секунд между перезапусками.

1 Ответ

0 голосов
/ 24 октября 2018

Значение $() согласно здесь :

Синтаксис уровня токена, поэтому значение знака доллара зависит от того токена, в котором он находится.Выражение $ (команда) является современным синонимом 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 $world

Мы перезапускаем контейнер докера, как вы это сделали, но только для одного из контейнеров, его имя читается из $word.

    sleep 30

Мы спим в течение 30 секунд, прежде чем повторить следующую *Значение 1044 *


Однострочная версия

Если вам нужна компактная версия, которая может работать как одна строка, вы можете сделать:

items=$(docker ps --format "{{.Names}}" | grep -v somename);for word in items; do;  docker restart $word; sleep 30; done;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...