Как запустить один процесс с помощью служебного сценария, переданного в ENTRYPOINT

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

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

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

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

person intechops6    schedule 10.07.2019    source источник
comment
Можете ли вы предоставить команду запуска докера.   -  person mchawre    schedule 10.07.2019
comment
Также убедитесь, что вы запускаете док-контейнер в режиме отсоединения в фоновом режиме, используя параметр -d.   -  person mchawre    schedule 10.07.2019
comment
@mchawre - я пытался работать в интерактивном режиме и в режиме -d. Я вижу, что контейнер вышел.   -  person intechops6    schedule 10.07.2019


Ответы (2)


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

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

person Guido U. Draheim    schedule 10.07.2019
comment
Запуск многих служб в контейнере может быть не лучшей практикой по многим причинам, бывают ситуации, когда запуск нескольких приложений в контейнере делает грязную и быструю работу, если он написан правильно. Приятно знать, что есть возможность использовать замену docker-systemctl. - person intechops6; 11.07.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, который позволяет вам объявлять параметры контейнера.

person David Maze    schedule 10.07.2019
comment
Идеальный ответ. Мне было интересно, почему служебный скрипт не используется в Dockerfile. Спасибо @David Maze. - person intechops6; 10.07.2019
comment
Контейнер немедленно вышел. В журналах контейнера говорится, что узел не является менеджером роя, а затем swarm init и swarm join для подключения к этому узлу. На этот раз я использовал CMD [nginx] для запуска сервера nginx. Зачем мне запускать это в кластере swarm? - person intechops6; 11.07.2019