Остановка процесса внутри контейнера Docker и выполнение команды

Всем привет. Суть в том, что у меня есть Докер контейнер с elasticsearch. Так уж вышло, что мне нужно выполнить команду по отвязке эластика от кластера, но для этого нужно остановить сам эластик. Когда я выполняю остановку эластика внутри контейнера, то контейнер останавливатеся. Возможно ли остановить эластик и оставить контейнер запущенным?


Ответы (1 шт):

Автор решения: Roman Konoval

Прям то, что вы хотите, сделать нельзя.

Фундаментально, докер-контейнер это процесс, к которому применили некие настройки. Подключили файловую систему, ограничили права, создали свое пространство для идентификаторов пользователей/групп, номеров портов и т.п.

Поэтому когда главный процесс в докере остановлен, то и контейнер остановлен.

Можно обойти это создав новый образ основываясь на остановленном контейнере, а потом запустив новый контейнер используя новый образ.

Вот пример. Запускаем

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-ами.

→ Ссылка