Остановка процесса внутри контейнера Docker и выполнение команды
Всем привет. Суть в том, что у меня есть Докер контейнер с elasticsearch. Так уж вышло, что мне нужно выполнить команду по отвязке эластика от кластера, но для этого нужно остановить сам эластик. Когда я выполняю остановку эластика внутри контейнера, то контейнер останавливатеся. Возможно ли остановить эластик и оставить контейнер запущенным?
Ответы (1 шт):
Прям то, что вы хотите, сделать нельзя.
Фундаментально, докер-контейнер это процесс, к которому применили некие настройки. Подключили файловую систему, ограничили права, создали свое пространство для идентификаторов пользователей/групп, номеров портов и т.п.
Поэтому когда главный процесс в докере остановлен, то и контейнер остановлен.
Можно обойти это создав новый образ основываясь на остановленном контейнере, а потом запустив новый контейнер используя новый образ.
Вот пример. Запускаем
docker run -ti ubuntu:latest /bin/sh -c "while true; do sleep 3; date >> /log; done"
Можно проверить из другой консоли (тут 2f93a0dc522f это container id) что все работает:
$ docker exec -ti 2f93a0dc522f /bin/bash -c "tail -f /log"
Wed Apr 21 20:03:05 UTC 2021
Wed Apr 21 20:03:08 UTC 2021
Теперь если остановить контейнер, то и exec тоже остановится.
Теперь можно сделать комит:
docker commit 2f93a0dc522f xxx
И теперь запустить уже новый контейнер:
docker run -ti xxx /bin/bash
root@a67f1f72ac62:/# cat /log
Wed Apr 21 20:03:02 UTC 2021
Wed Apr 21 20:03:05 UTC 2021
Из этой консоли можно запускать нужную вам команду.
У вас, вполне возможно, данные или конфигурация хранится в volume-ах. Это значит вы запускали оригинальный docker run с volume-aми. Значит и новый контейнер нужно запускать с теми же volume-ами.