neo4j в Dockerfile - запуск службы neo4j-service не отключается

Я устанавливаю neo4j как часть более крупной установки в док-контейнере (не отдельный образ neo4j). Сначала я тестирую его на Windows в виртуальной машине докер-машины, и он строится и работает как шарм. Затем я переношу его в Digital Ocean, и он тоже собирается, но при достижении service neo4j-service start в Dockerfile показывает

Starting Neo4j Server...WARNING: not changing user
process [138]... waiting for server to be ready............................

и точки продолжают прибавляться — ни провала, ни отрыва. Если я войду в контейнер и просто запущу service neo4j-service start, произойдет то же самое. Однако в этом случае, если я ^C процесс и проверю статус, neo4j работает и отвечает на 7474.

Так что на самом деле речь идет не о запуске службы, а об отсоединении

Я пробовал (в работающем контейнере):

  • обновление java до oracle 8 (sudo apt-get install oracle-java8-installer)
  • запуск neo4j напрямую (/var/lib/neo4j/bin/neo4j start)

Результат всегда один и тот же: процесс не отсоединяется, сохраняя точки, служба работает нормально после выхода из процесса.

Некоторая информация о системе (из контейнера, созданного из образа Ubuntu по умолчанию):

root@04b1ec55572e:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Reelease:        14.04
Cdename:       trusty

root@04b1ec55572e:/# ulimit  -n
524288

Хост-система:

/# lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty

Единственный вариант, который я вижу сейчас, это запустить команду в фоновом режиме (service neo4j-service start &), заснуть на 2-3 секунды, а затем проверить с помощью ps, работает ли служба, но зачем вообще нужна эта ужасная мера.

Любая помощь приветствуется.

Журналы: https://gist.github.com/koacms-deployment/dc5afb2a8a371237cfd8

Докерфайл:

# Get neo4j
RUN wget -O - http://debian.neo4j.org/neotechnology.gpg.key| apt-key add - # Import our signing key
RUN echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list # Create an Apt sources.list file
RUN apt-get update -y # Find out about the files in our repository
RUN apt-get install neo4j -y # Install Neo4j, community edition

# update neo4j listen ip to current ip
RUN sed "s/#org.neo4j.server.webserver.address=0.0.0.0/org.neo4j.server.webserver.address=0.0.0.0/" -i /etc/neo4j/neo4j-server.properties

# ... a bit later ...

RUN service neo4j-service start

person Igor R    schedule 07.09.2015    source источник
comment
Какой файл докера вы использовали?   -  person Michael Hunger    schedule 07.09.2015
comment
Используйте docker exec /bin/bash, чтобы перейти к работающему образу и проверить data/log/neo4j.log и data/graph.db/messages.log на наличие ошибок и сообщить о них.   -  person Michael Hunger    schedule 07.09.2015
comment
Спасибо, Майкл, за то, что так быстро ответил на эти вопросы, и извините, я не смог найти никакой помощи в ваших предыдущих ответах. Я обновил вопрос с журналом. Мне также удалось получить все ошибки после 120 секунд при неправильном выполнении других вещей, таких как права доступа, но в том виде, в котором он есть сейчас, в журналах нет ничего плохого. Я использую свой собственный файл докера, добавляя это также к вопросу   -  person Igor R    schedule 07.09.2015
comment
переместил журналы в суть: gist.github.com/koacms-deployment/dc5afb2a8a371237cfd8   -  person Igor R    schedule 07.09.2015
comment
Я наконец понял, что /bin/neo4j — это просто сценарий оболочки, который делает именно это — спит и проверяет. поэтому, заглянув внутрь скрипта, очевидно, lsof не возвращает то, что ожидает скрипт. Это верно, если я попытаюсь запустить lsof вручную, когда сервер работает (проверено с помощью wget localhost:7474). Но netstat -a показывает, что 7474 и 7473 прослушиваются. Я продолжаю искать, но буду признателен за идеи.   -  person Igor R    schedule 07.09.2015


Ответы (1)


Итак, итоги расследования:

Журналы neo4j не показывают ничего интересного, но заглянув в /var/lib/neo4j/bin/neo4j (исполняемый файл neo4j, запускающий службу), я понял, что он использует lsof для проверки того, готов ли процесс прослушивать 7474 (или любой другой порт, настроенный neo4j использовать).

Вызов lsof в сценарии запуска neo4j ничего не возвращал, даже когда я мог подтвердить, что neo4j уже работает как с использованием netstat, так и с прямым запросом к конечной точке neo4j REST.

Проверка lsof выявила несколько сообщений об отказе в доступе, связанных с neo4j.

Погуглив что-то вроде «отказано в доступе к lsof docker», я нашел эту небольшую полезную статью: https://practiceml.wordpress.com/2014/12/26/permission-denied-for-lsof-in-docker/. У автора были похожие проблемы с Linux Mint 17, но, видимо, это относится и к Ubuntu.

Исправление сводится к запуску этого на хост-компьютере:

sudo aa-complain /etc/apparmor.d/docker

Если у вас нет aa-complain, установите его с помощью:

sudo apt-get install apparmor-utils

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

person Igor R    schedule 07.09.2015