Как запустить отдельный процесс, используя служебный скрипт, переданный ENTRYPOINT - PullRequest
0 голосов
/ 10 июля 2019

Я передаю служебный скрипт в ENTRYPOINT. Служба запущена, но закрыта. Я должен запустить процесс для каждого контейнера, используя служебный скрипт из ENTRYPOINT или CMD. Таким образом, я могу перезагрузить конфигурацию внутри контейнера, используя служебный скрипт. Я попытался также с оператором CMD, но он запускает службу, но сразу же существует контейнер.

ENTRYPOINT ["/etc/init.d/elasticsearch", "start"]

Сценарий / etc / init.d /asticsearch имеет нижеприведенный код для запуска службы в качестве демона.

cd $ES_HOME
echo -n $"Starting $prog: "
daemon --user elasticsearch --pidfile $pidfile $exec -p $pidfile -d
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval

Разве невозможно запустить службу с помощью сценария запуска и сохранить работоспособность контейнера?

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

docker build -f Dockerfile -t="elk/elasticsearch" .
docker run -d elk/elasticsearch
docker run -it elk/elasticsearch bash

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Скрипты sysv относятся к типу «разветвления» в терминах менеджера сервисов. Так что он отсоединится от стартового скрипта. Затем контейнеру нужен процесс инициализации на pid 1, который управляет фоновым процессом (процессами).

Если вы не хотите извлекать соответствующую команду из начального сценария, вы все равно можете использовать docker-systemctl-replace , чтобы сделать обе вещи за вас. Если он запускается как CMD, он запускает включенные служебные сценарии так же, как вы используете его на обычном компьютере.

1 голос
/ 10 июля 2019

Как правило, вы не используете служебные скрипты с 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, который позволяет объявлять параметры контейнера.

...