Как перезапустить существующий контейнер Docker в режиме перезапуска = "всегда"?
Когда вы изначально запускаете контейнер Docker из изображения, вы можете указать опцию:
--restart="always"
Это гарантирует, что контейнер всегда перезагружается демоном Docker, если по какой-то причине он останавливается. Таким образом, вы можете запустить контейнер следующим образом:
docker run --restart="always" <IMAGE>
Также вы можете перезапустить существующий контейнер Docker, указав его идентификатор контейнера, то есть:
docker start <CONTAINER ID>
Однако я не могу определить, возможно ли изменить существующий контейнер, который изначально не был запущен с опцией --restart="always
, чтобы преобразовать его для повторного запуска в будущем.
В настоящее время единственным способом, я могу думать, это сохранить контейнер в качестве нового изображения, а затем запустить это изображение в качестве нового контейнера с опцией --restart="always"
. Действительно ли это будет правильным способом?
РЕДАКТИРОВАТЬ. Из-за того, что я, возможно, не излагал достаточно ясно, так это то, что я думаю о ситуации, когда в контейнере произошли изменения, поскольку они были изначально запущены, что необходимо сохранить. Так что просто запуск нового контейнера из исходного изображения будет недостаточным.
Ответы
Ответ 1
Хорошо, поэтому, чтобы ответить на мой собственный вопрос, кажется, что просто не перезапустить тот же контейнер с --restart=always
, потому что это то, что вам нужно сделать, когда вы запускаете контейнер в первый раз, а не параметр, который вы можете использовать, когда вы запускаете существующий контейнер.
Существует три возможных варианта:
- Как указано в @user2915097, вы можете отказаться от исходного контейнера (остановить его, а затем удалить его с помощью
docker rm <CONTAINER ID>
, чтобы убрать). Затем просто запустите новый контейнер из исходного изображения, указав опцию -restart=always
на этот раз.
-
Если никакие тома не использовались, поэтому изменения являются внутренними для контейнера, вам необходимо перенести контейнер в новое изображение, а затем запустить новый контейнер с этого образа.
docker commit <CONTAINER ID> <NEW IMAGE NAME>
docker run -d --restart=always ... <NEW IMAGE NAME>
-
Если используются тома и все изменения ограничены томами, вы можете запустить второй контейнер с параметром --volumes-from
без необходимости фиксации новой версии изображения. то есть.
-
docker stop <CONTAINER 1 NAME>
-
docker run -d --restart=always --volumes-from <CONTAINER 1 NAME> ... <ORIGINAL IMAGE NAME>
Тогда было бы безопасно удалить Контейнер 1, поскольку тома не будут удалены, пока другой контейнер продолжает их использовать.
Думаю, есть и четвертая возможность; если вы использовали тома (ы), и вы знаете, что в контейнер были внесены изменения, которые не находятся на томе, тогда вам придется использовать комбинацию (2) и (3).
Ответ 2
Теперь у нас есть docker update, который позволяет изменить политику перезапуска запущенного контейнера.
docker update --restart=always <CONTAINER ID>
Есть еще три варианта:
- no (по умолчанию)
- на провал
- если-не остановлен
Подробнее см. ссылку .
Ответ 3
Обновление: это позволило включить перезапуск. Но вернуть его обратно в нет, и он возвращает reset обратно, и контейнер снова запускается!:( Я собираюсь оставить этот ответ здесь, если кто-то выяснит, как это работает. Я должен быть рядом!
Люди, я нашел самое хакерское решение, которое оборачивается копированием контейнеров и т.д.
vi/var/lib/docker/container/$(docker inspect -f '{{.Id}}' $ContainerID)/hostconfig.json
Найдите "RestartPolicy". Установите его "нет", "всегда" и т.д.
Возможно, кто-то может обернуть это в script!?
В любом случае, эта часть json вместе с config.json позволит вам изменять все виды вещей, которые вы пропустили при создании своего контейнера.
Ответ 4
извлечь из http://www.brandpending.com/blog/2014/11/21/setting-and-re-setting-the-restart-behaviour-of-a-docker-container
Итак, скажем, вы хотите изменить политику перезапуска этого контейнера от всегда до отказа. Для этого вам необходимо остановить контейнер, удалите его и заново запустите с новой политикой перезапуска.