выход из докера сразу после запуска apache и neo4j - PullRequest
0 голосов
/ 12 июля 2019

У меня есть скрипт /init, который запускает apache и neo4j.Этот скрипт уже в образе ubuntu:14.Ниже приводится содержимое /init:

service apache2 start
service neo4j start

Из этого изображения я создаю другое изображение со следующим файлом dockerfile

FROM ubuntu:v14
EXPOSE 80 80
ENTRYPOINT ["/init"]

Когда я запускаю команду docker run -d ubuntu:v15,контейнер запускается и затем выходит.Насколько я понял, опция -d запускает контейнер в фоновом режиме.Также скрипт \init запускает два демона. Почему контейнер выходит?

Ответы [ 2 ]

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

На самом деле, я думаю, что ваша первая проблема - это файл #! в init, если вы не добавили что-то вроде #!/bin/bash в начале, контейнер будет выдавать следующее сообщение:

shubuntu1@shubuntu1:~$ docker logs priceless_tu
standard_init_linux.go:207: exec user process caused "exec format error"

Но даже если вы решите вышеуказанную проблему, вы все равно не сможете запустить свой контейнер, причина та же, что и другие люди сказали: PID 1 должен всегда присутствовать, в вашем случае после service xxx start окончания - выход PID 1, который также приведет кв выходе из контейнера.

Итак, чтобы решить эту проблему, вы должны установить одну команду, никогда не выходящую, минимальный работоспособный пример для вашей справки:

Dockerfile:

FROM ubuntu:14.04
RUN apt-get update && \
    apt-get install -y apache2

COPY init /
RUN chmod +x /init

EXPOSE 80
ENTRYPOINT ["/init"]

init:

#!/bin/bash

# you can add other service start here
# e.g. service neo4j start as you like if you have installed it already

# next will make apache run in foreground, so PID1 not exit.
/usr/sbin/apache2ctl -DFOREGROUND
1 голос
/ 12 июля 2019

Когда ваш Dockerfile указывает ENTRYPOINT, время жизни контейнера точно соответствует длине его процесса.Обычно поведение service ... start состоит в том, чтобы запустить службу как фоновый процесс, а затем немедленно вернуться;поэтому ваш сценарий /init запускает две команды service и завершает работу, и теперь, когда процесс точки входа завершен, контейнер завершается.

Общепринятая рекомендация - запускать только один процесс в контейнере.Это особенно верно, когда один из процессов является базой данных.В вашем случае есть стандартные Docker Hub Apache httpd и neo4j изображений, поэтому я бы начал с использования инструмента оркестровки, такого как Docker Compose длязапустить эти два контейнера бок о бок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...