Wie führt man einen Speicherauszug einer Neo4j-Datenbank in einem Docker-Container durch?

8

Ein Docker-Container für Neo4j wird gemäß der Dokumentation gestartet und funktioniert ordnungsgemäß mit dem folgenden Befehl:

$ docker run \
    --detach \
    --publish=7474:7474 \
    --publish=7473:7473 \
    --publish=7687:7687 \
    --volume=$HOME/neo4j/data:/data \
    --volume=$HOME/neo4j/logs:/logs \
    --volume=$HOME/neo4j/ssl:/ssl \
    --ulimit=nofile=40000:40000 \
    --name=myname-neo4j \
    neo4j:3.1.1

Wenn ich versuche, einen neo4j-adminSpeicherauszug der Datenbank durchzuführen , wird folgende Fehlermeldung angezeigt:

$ docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump
command failed: the database is in use -- stop Neo4j and try again

Wenn jedoch der Neo4j-Prozess gestoppt wird, was die einzige Möglichkeit zu sein scheint, die Datenbank freizugeben, wird der Container geschlossen. Dies scheint das erwartete Verhalten von Docker zu sein. Daher scheint es unmöglich zu sein, neo4j-admin dumpaus dem Container heraus aufzurufen, ohne dass die Datenbank verwendet wird.

Wie kann dies behoben werden, während Docker noch verwendet wird?

Gregyski
quelle

Antworten:

7

1: Stoppen Sie den Behälter.

docker stop myname-neo4j

2: Entfernen Sie den Behälter

docker rm myname-neo4j

3: Führen Sie den Container im interaktiven Modus (-it) ohne die Option (Trennen) aus und führen Sie die Shell aus (/ bin / bash).

docker run \
--publish=7474:7474 \
--publish=7473:7473 \
--publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
--volume=$HOME/neo4j/logs:/logs \
--volume=$HOME/neo4j/ssl:/ssl \
--ulimit=nofile=40000:40000 \
--name=myname-neo4j \
-it \
neo4j:3.1.1 \
-c /bin/bash

Jetzt befinden Sie sich im neo4j-Container, ohne Neo auszuführen.

4: Überprüfen Sie, ob neo nicht aktiv ist, indem Sie den URI-Endpunkt in ( http: // yourhost: 7474 ) besuchen . Sie sollten die Meldung "Verbindung nicht möglich" sehen.

5: Speichern Sie Ihre Datenbank

docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump
Juan
quelle
Für Schritt 5 kann man entweder den Befehl ausführen, wie Sie ihn von einer zweiten Sitzung außerhalb des Containers angegeben haben. Oder man kann es einfach weglassen docker exec -ti myname-neo4jund an der Bash-Eingabeaufforderung im Container ausführen.
Gregyski
1
Was ist, wenn der Container bereits ausgeführt wird? Ich werde alle Daten verlieren, die ich sichern möchte, wenn ich es
stoppe
Es wird dringend empfohlen, ein Volume für Ihre Daten bereitzustellen, damit es dauerhaft und unabhängig von der Lebensdauer Ihres neo4j-Containers ist. (Siehe: docs.docker.com/engine/tutorials/dockervolumes ). Wenn Sie dies nicht getan haben, verwenden Sie das Flag -rm nicht im Befehl "docker run". Stoppen Sie den Container, übernehmen Sie die Änderungen mit Docker Commit und fahren Sie mit Schritt 4 fort. Oder schreiben Sie Ihren Docker-Container einfach in eine externe Shell, bevor Sie ihn stoppen.
Juan
0

Ich hatte zuvor das gleiche Problem, also habe ich diese Problemumgehung geschrieben, um neo4j-Daten zu sichern und außerhalb des Containers auf den Host-Computer zu ziehen.

docker rm --force neo4j-dump

docker run \
--name neo4j-dump \
--env-file /storage/bin/.neo4j.env \
--mount type=bind,source=<neo4j_data_folder>,target=/data \
neo4j:3.1.1 bin/neo4j-admin dump --database=graph.db --to=/graph.db.dump

docker cp `docker ps -aqf "name=neo4j-dump"`:/graph.db.dump <target_dump_file>

docker rm --force neo4j-dump

Dadurch werden neue Container- und Dump-Daten erstellt, anstatt den neo4j-Dienst zu starten. Kopieren Sie dann den Dump auf den Host, aktualisieren Sie ihn einfach und auf Ihren

Khaled AbuShqear
quelle
0

Zufällig ist dies in Neo4j 4.0 jetzt viel einfacher, da Sie Datenbanken stoppen und starten können, ohne den gesamten Docker-Container herunterfahren zu müssen.

Wenn wir also einen Speicherauszug einer Datenbank namens "foo" erstellen möchten, gehen wir wie folgt vor:

STOP DATABASE foo

docker exec -it our-neo4j-container neo4j-admin dump --database=foo --to=/tmp/foo.db.dump

docker cp our-neo4j-container:/tmp/foo.db.dump .

START DATABASE foo

Auch als Blog-Beitrag verfasst - https://markhneedham.com/blog/2020/01/28/neo4j-database-dump-docker-container/

Mark Needham
quelle