Как правило, вы не используете служебные скрипты с Docker. Кроме того, в общем случае вы никогда не перезапускаете сервис внутри контейнера; вместо этого вы останавливаете существующий контейнер, удаляете его и запускаете новый.
Стандартный шаблон - запуск любой службы, которую вы пытаетесь запустить, непосредственно, в качестве процесса переднего плана. (Нет /etc/init.d
, service
или systemctl
что угодно.) Вы можете извлечь соответствующую команду из сценария инициализации, который вы показываете. Я бы заменил вашу команду ENTRYPOINT на
CMD ["elasticsearch"]
(но также дважды проверьте документацию Elasticsearch на случай, если есть какие-то другие параметры командной строки, которые имеют значение).
Вторая часть этого заключается в том, чтобы убедиться, что данные базы данных хранятся вне контейнера. Обычно вы используете опцию docker run -v
для установки альтернативного хранилища в контейнер. Например:
docker run \
--name elasticsearch \
-p 9200:9200 \
-v ./elasticsearch:/var/data/elasticsearch \
imagename
Как только вы это сделаете, вы сможете остановить, удалить и заново создать контейнер, что является правильным способом перезапустить службу. (Это необходимо сделать, если базовый образ когда-либо изменяется; это происходит, если есть исправление ошибки или проблема безопасности в программном обеспечении образа или в базовом дистрибутиве Linux.)
docker stop elasticsearch
docker rm elasticsearch
docker run -- name elasticsearch ...
Вы можете написать простой сценарий оболочки для команды docker run
или использовать инструмент оркестровки, такой как Docker Compose, который позволяет объявлять параметры контейнера.