Постоянная настройка restart-policy

Здравствуйте,

Я использую репозиторий discourse_docker со скриптом launcher для запуска внутреннего экземпляра Discourse. Я хотел бы постоянно изменить политику перезапуска с always на unless-stopped, чтобы иметь возможность останавливать контейнеры Docker при обновлении ОС или перезагрузке системы.

Я вижу, что политика перезапуска является переменной в скрипте launcher, но как лучше всего сохранить эту настройку при создании нового контейнера? Это должно работать как через “launcher rebuild”, так и через docker_manager, доступный по адресу /admin/upgrade.

Заранее спасибо,
С уважением,
.sascha

Я не припоминаю, чтобы кто-то ещё задавал этот вопрос, и я не вижу очевидного способа. Думаю, ваш лучший вариант — выполнить

  ./launcher destroy app

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

  ./launcher start app

Это уничтожит контейнер, поэтому все внесённые вами изменения внутри него (например, обновления через docker_manager) будут утеряны.

О, но вот что:

кратко: после каждой пересборки выполните docker update --restart=unless-stopped app.

Да, я знаю это :wink: Обновление Docker — это то, что я сейчас делаю. Но я боюсь, что в какой-то момент при следующих пересборках забуду об этом. Поэтому и возник вопрос: как сделать это постоянным.
Другой вариант — просто отредактировать скрипт запуска и надеяться, что при pull не возникнет слишком много конфликтов при перебазировании :wink:

Единственный раз, когда у меня возникали проблемы с перезапуском после загрузки, был случай, когда я переключился с app.yml на web_only.yml и забыл уничтожить контейнер app. Я регулярно выполняю обновления Docker и перезагрузки без каких-либо проблем с автоматическим запуском. К слову, за последние 5 лет я не видел, чтобы кто-то ещё беспокоился об этом. Если у вас нет каких-то особых обстоятельств, о которых я не знаю, возможно, просто не стоит переживать?

Сегодня проблема заключалась в том, что я хотел выполнить чистую установку, так как у меня была какая-то странная версия 2.4.0-betaXYZ, которая не обновлялась самостоятельно. Я провёл тест на другой виртуальной машине: выполнил чистую установку и восстановил резервную копию до версии 2.7.12, что сработало идеально (также разделил контейнер с данными на Redis и PostgreSQL).

Основной сервер всё ещё работал на старой версии Ubuntu и старого Docker, поэтому я хотел:

  1. создать резервную копию,
  2. остановить Discourse,
  3. выполнить обновление ОС со всеми необходимыми перезагрузками, не беспокоясь о Discourse,
  4. выполнить чистую установку,
  5. восстановить резервную копию.

Я просто хотел оставить контейнеры выключенными, но не удалять их сразу, так как больше не был уверен, нужны ли мне какие-то данные из них, которые я мог забыть во время теста. И я подумал: «Эй, политика перезапуска unless-stopped для меня идеальна — она гарантирует, что контейнеры автоматически запускаются после перезагрузки, если только вы не остановите их вручную. Обычно именно это мне и нужно, так почему бы не сделать это постоянным?»

Если это невозможно, ничего страшного. :slight_smile: Просто обновлю Docker (или, если буду слишком часто об этом забывать, настрою автоматическое обновление Docker через cron каждые 5 минут ;))