Docker: добавьте политику перезапуска в уже созданный контейнер

229

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

Хотя это очень полезно, я вижу, что команда restart policy просто работает, docker runа не работает docker start. Итак, мой вопрос:

Есть ли способ добавить перезапускающие политики в контейнер, который уже был создан в прошлом?

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

Ответы:

575

В последних версиях Docker (по состоянию на 1.11) у вас есть updateкоманда:

docker update --restart=always <container>
Пау Руслан Феррагут
источник
9
Похоже, это было добавлено в Docker 1.11.0.
февраля
4
Должен быть принят ответ с оговоркой, что он работает с Docker 1.11.
JohnDoe
6
с докером 17.09 Мне пришлось запустить docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatics
HarlemSquirrel
4
docker updateпринимает несколько идентификаторов контейнеров, так что вообще не нужно xargs, просто сделайте docker update --restart=always $(docker ps -q).
Markusk
49

Существует два подхода к изменению RestartPolicy:

  • Узнайте идентификатор контейнера, остановите всю службу Docker, измените /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, установите RestartPolicy -> Name в значение «Always» и запустите службу Docker.
  • docker commit ваш контейнер как новое изображение, остановите и запустите текущий контейнер и запустите новый контейнер с изображением.
Йельский Хуан
источник
2
остановка контейнера, редактирование, запуск контейнера. работает как шарм. Я не знаю, почему редактирование отключено.
туман
2
Наконец, разумный ответ :)
Navin
Работал для меня на старом сервере с докером 1.10 (не спрашивайте 😱). К сожалению, docker updateпозволяет изменить политику перезапуска только на 1.11+
Игорь Купчиньский
1

Использование --restart=alwaysполитики будет обрабатывать перезапуск существующих контейнеров в случае перезагрузки.

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

Попытка автоматического удаления контейнера, если он существует с помощью опции put docker run --rm, также будет проблемой с --restart=always политикой, поскольку они конфликтуют друг с другом .

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

Поэтому в этом случае лучше выбрать другой вариант: --restart, если политика не остановлена .

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

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

Это похоже на то --restart=always, что при остановке контейнера (вручную или иным образом) он не перезапускается даже после перезапуска демона Docker.

Поэтому при использовании этой --restart unless-stoppedполитики, чтобы убедиться, что перезапуск работает в случае, если он случайно остановится при закрытии терминала, выполните один раз в другом терминале, как показано ниже:

$ docker ps
$ docker restart <container>

Дождитесь окончания процесса уничтожения в предыдущей оболочке, затем закройте его и просто выйдите ( не выходите ).
И еще раз проверьте в оставшемся терминале, работает ли контейнер:

$ docker ps

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

Chetabahana
источник