Проблема с загрузкой дампа neo4j в докер контейнер - PullRequest
0 голосов
/ 11 октября 2018

Я использую Docker для запуска нескольких экземпляров neo4j для моего проекта.У меня есть требование, что я должен загрузить дамп графика в один из моего док-контейнера neo4j, и я должен сделать это снова и снова (так как дамп графика будет предоставлен отдельной группой людей).

Это мои шаги, которые я выполнил, чтобы сделать то же самое -

    # docker run --publish=7474:7474 --publish=7687:7687 \
    --volume=/home/dimension/neo4j/container3/data:/data \
    --volume=/home/dimension/neo4j/container3/logs:/logs \
    --volume=/home/dimension/neo4j/container3/conf:/conf \
    --volume=/home/dimension/neo4j/container3/plugins:/plugins \
    neo4j:3.3.3

    # docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                                      NAMES
eee581b2f493        neo4j:3.3.3         "/docker-entrypoint.…"   2 hours ago         Up 2 seconds               0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp   priceless_ride

Это вызывает контейнер, но база данных пуста.Затем я попробовал следующее, чтобы загрузить дамп neo4j в мой недавно построенный контейнер Docker

# docker stop priceless_ride
priceless_ride

# cp home/dimension/neo4j/dumps/2018-09-05.dump ~/neo4j/container3/data/

# docker run --publish=7474:7474 --publish=7687:7687 \
--volume=/home/dimension/neo4j/container3/data:/data \
--volume=/home/dimension/neo4j/container3/logs:/logs \
--volume=/home/dimension/neo4j/container3/conf:/conf \
--volume=/home/dimension/neo4j/container3/plugins:/plugins \
-i -t neo4j:3.3.3 /bin/bash

Приведенная выше команда создает отдельный контейнер и запускает контейнер в интерактивном режиме.Как только я попаду внутрь контейнера, я запускаю -

bash-4.4# bin/neo4j-admin load --from=/data/2018-09-05.dump --database=graph.db --force
bash-4.4# exit

Теперь я выполню команду docker ps -a, я увижу 2 контейнера в выводе

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
073c31c75ff5        neo4j:3.3.3         "/docker-entrypoint.…"   8 seconds ago       Exited (0) 3 seconds ago                       focused_zhukovsky
eee581b2f493        neo4j:3.3.3         "/docker-entrypoint.…"   3 hours ago         Exited (0) 7 minutes ago                       priceless_ride

Мне нужно удалить только что построенныйконтейнер как то больше не нужен.выполнив docker rm focused_zhukovsky

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

# docker start priceless_ride

и проверил браузер, используя http://127.0.0.1:7474/browser/, контейнер теперь имеет загруженную форму базы данныхДамп.

Выполнение вышеупомянутых шагов для загрузки дампа графика - это нормально, но это громоздко, если мне придется делать это снова и снова.Это более чистый способ загрузки дампа neo4j без необходимости запуска отдельного контейнера в интерактивном режиме, а затем запускает команду neo4j-admin load.

Возможно ли запустить докер-контейнер без запуска neo4j внутри него.Если это возможно, я могу зайти внутрь контейнера и запустить команду neo4j-admin load столько раз, сколько захочу.

Я застрял в этой проблеме довольно давно.Я буду очень признателен за любую помощь по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Похоже, вы используете Neo4j Community Edition, а не Enterprise Edition, следовательно, вы не можете загрузить дамп базы данных во время выполнения.Эта функция доступна только для Enterprise Edition, поэтому в Community Edition вам может понадобиться настроить ее.

Поэтому перед запуском контейнера neo4j скопируйте дамп по пути, который вы собираетесь смонтировать в контейнер, и загрузите его при запуске докера

# cp home/dimension/neo4j/dumps/2018-09-05.dump ~/neo4j/container3/data/

# docker run --publish=7474:7474 --publish=7687:7687 \
    --volume=/home/dimension/neo4j/container3/data:/data \
    --volume=/home/dimension/neo4j/container3/logs:/logs \
    --volume=/home/dimension/neo4j/container3/conf:/conf \
    --volume=/home/dimension/neo4j/container3/plugins:/plugins \
    -it neo4j:3.3.3 /bin/bash -c "[ -f /data/db.dump ] \
    && /var/lib/neo4j/bin/neo4j-admin load --from=/data/db.dump \
    --database=graph.db --force
0 голосов
/ 12 октября 2018

Один простой и быстрый способ, о котором я могу подумать сейчас, - это переопределить стандартную команду контейнера neo4j примерно так:

docker run  -d --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/datanew:/data neo4j /bin/bash -c "[ -f /data/db.dump ] && /var/lib/neo4j/bin/neo4j-admin load --from=/data/db.dump --database=graph.db --force; neo4j console"

Вы используете команду -c с / bin / bash для выполнения нескольких команд,[-F /data/db.dump] проверяет, существует ли дамп базы данных и выполняет ли он команду импорта дампа neo4j.После запуска neo4j.

Учитывая, что у вас есть дамп базы данных с именем db.dump в вашем каталоге $ HOME / datanew, neo4j-admin сможет загрузить его перед запуском сервера neo4j.Остановка, замена дампа на новый и запуск его снова должны привести к открытию новой базы данных.

Уверен, что то же самое можно сделать, если вы создадите образ докера на основе образа neo4j и добавитекоманда в конце, которая будет делать то же самое.Это должно быть намного чище.

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