Docker: Додайте політику перезавантаження до вже створеного контейнера


229

Я бачу, що Docker додав щось, що називається політиками перезавантаження для обробки перезавантаження контейнерів у разі, наприклад, перезавантаження.

Хоча це дуже корисно, я бачу, що команда політики перезавантаження просто працює, docker runа не працює docker start. Отже, моє питання:

Чи є спосіб додати політику перезавантаження до контейнера, який вже був створений у минулому?


Ви повинні змінити прийняту відповідь на відповідь @Yale Huang. Прийнята відповідь невірна в поточних версіях докера. Я розумію, що відповідь, можливо, допомогла вам тоді, але зараз вона вводить в оману.
Степан Вавра

2
Зроблено. Дякую за попередження
Енріке Морено Монт

Відповіді:


574

В останніх версіях докера (станом на 1.11) у вас є updateкоманда:

docker update --restart=always <container>

9
Схоже, це було додано в Docker 1.11.0.
phansen


4
Повинен бути прийнятий відповідь із застереженням про те, що він працює на Докер 1.11.
JohnDoe

6
з docker 17.09 Мені довелося запустити docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel

4
docker updateприймає декілька ідентифікаторів контейнерів, тому зовсім не потрібно xargs, просто робіть docker update --restart=always $(docker ps -q).
Маркуск

49

Існує два підходи до зміни RestartPolicy:

  • Дізнайтеся ідентифікатор контейнера, зупиніть всю службу докера, змініть /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, встановіть RestartPolicy -> Ім'я на "завжди" та запустить послугу докера.
  • docker commit ваш контейнер як нове зображення, зупиніть & rm поточний контейнер і запустіть новий контейнер із зображенням.

2
зупинити контейнер, відредагувати, запустити контейнер. працює як шарм. Я не знаю, чому редагування вимкнено.
туман

2
Нарешті, розумна відповідь :)
Навін

Працював для мене на старому сервері з докером 1.10 (не питати 😱). На жаль, docker updateдозволяє змінювати політику перезавантаження лише 1.11+
Ігор Купчинський

1

Використання --restart=alwaysполітики буде обробляти перезапуск існуючих контейнерів у разі перезавантаження.

Проблема полягає в тому, що якщо є кілька контейнерів з --restart=alwaysпри запуску образу нової версії , як описано в докер - як відключити функцію автоматичного перезапуску на контейнер? .

Спроба автоматично видалити контейнер, коли він існує за допомогою put put docker run --rm, також матиме проблеми з --restart=always політикою, оскільки вони суперечать один одному .

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

Тож у цьому випадку краще вибрати інший варіант: --запустити, якщо не зупинено політику.

$ docker run --rm --restart unless-stopped <image>

Ця політика не конфліктуєdocker run --rm , але , як описано в Докер документації :

Це аналогічно --restart=always, за винятком того, що при зупинці контейнера (вручну чи іншим способом) він не перезапускається навіть після перезавантаження демона Docker.

Отже, використовуючи цю --restart unless-stoppedполітику, щоб переконатися, що перезапуск працює у випадку випадкового припинення закриття терміналу, зробіть один раз в іншому терміналі, як показано нижче:

$ docker ps
$ docker restart <container>

Зачекайте, поки процес вбивства закінчиться в попередній оболонці, а потім закрийте її та просто залиште ( не робіть вихід ).
І перевірте ще раз, що залишився термінал, чи контейнер все ще працює:

$ docker ps

Якщо вона все ще запущена, ви можете безпечно перезавантажити і ще раз перевірити, чи програма перезапускається, і побачити, чи ваш докер чистий без невикористаних кількох контейнерів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.