Docker-Compose Bereitstellung von Neo4j mit APOC

Einführung

Obwohl die Anzahl der Benutzer von Neo4j gestiegen ist, wird es immer noch nicht erkannt. Da Neo4j Desktop unter Windows verfügbar ist, ist die Verwendung nicht unpraktisch. Wenn Sie jedoch eine einfache Anwendung erstellen und an ein Team verteilen, nimmt das Erstellen eines Images viel Platz in Anspruch, sodass die Verwendung von Docker einfacher ist. Vor allem, wenn Sie wie jetzt Remote-Arbeiten ausführen. Als ich versuchte, es als Set mit der App mit Docker-Compose zu verteilen, gab es nicht viele Docker-Informationen für neo4j, also habe ich es nachgeschlagen ~~ Ich werde als Erinnerung veröffentlichen, was auf verschiedene Arten funktioniert hat.

Ordnerstruktur

https://github.com/MichitoIchimaru/neo4j_docker-compose

Folder
│  docker-compose.yml
├─ docker
│   └─neo4j
│      Dockerfile
│      background.sh
│      init.sh
│      init.cypher
└─volumes
   └─neo4j
      └─plugins
         apoc.jar

docker-compose.yml

docker-compose.yml


version: "3"

networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.30.0.0/24

services:
  neo4j:
    container_name: neo4j
    build: ./docker/neo4j
    volumes:
      - ./volumes/neo4j/data:/data
      - ./volumes/neo4j/plugins:/plugins
      - ./volumes/neo4j/logs:/logs
      - ./volumes/neo4j/import:/import
      - ./volumes/neo4j/init:/init
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
#      - NEO4JLABS_PLUGINS=["apoc"]
      - NEO4J_apoc_export_file_enabled=true
      - NEO4J_apoc_import_file_enabled=true
      - NEO4J_apoc_uuid_enabled=true
      - NEO4J_dbms_security_procedures_unrestricted=apoc.*
      - NEO4J_dbms_security_procedures_whitelist=apoc.*
      - NEO4J_dbms_memory_heap_initial__size=512m
      - NEO4J_dbms_memory_heap_max__size=2G
      - NEO4J_dbms_default__listen__address=0.0.0.0
      - NEO4J_dbms_connector_bolt_listen__address=:7687
      - NEO4J_dbms_connector_http_listen__address=:7474
      - NEO4J_dbms_connector_bolt_advertised__address=:7687
      - NEO4J_dbms_connector_http_advertised__address=:7474
      - NEO4J_dbms_allow__upgrade=true
      - NEO4J_dbms_default__database=neo4j
      - NEO4J_AUTH=neo4j/p@ssw0rd
      - EXTENSION_SCRIPT=/tmp/background.sh
    restart: unless-stopped
    networks:
      app_net:
        ipv4_address: 172.30.0.3
Kommentar
#      - NEO4JLABS_PLUGINS=["apoc"]

Wenn Sie diesen Teil auskommentieren, wird apoc.jar automatisch aus dem Internet heruntergeladen. Dieses Mal wird apoc.jar von Anfang an im Ordner volume / neo4j / plugins gespeichert, daher muss es nicht heruntergeladen werden, daher habe ich es auskommentiert. Das Herunterladen von apoc.jar nimmt viel Zeit in Anspruch, sodass die Verwendung der zuvor heruntergeladenen Datei die Startzeit verkürzen kann. Die Aktivierung dieser Funktion bietet jedoch einen Vorteil. Dieses Mal wird neo4j: 4.1.3 (spätestens ab dem 15. Oktober 2020 4.1.3) für das Docker-Image von Neo4j verwendet. Da es jedoch eine Version von apoc.jar gibt, die der Version von neo4j entspricht, wird es kombiniert. Je nach Situation funktioniert es möglicherweise nicht. Wenn Sie diesen Kommentar entfernen, wird apoc.jar, das dem von Ihnen verwendeten Neo4j-Image entspricht, automatisch identifiziert und installiert.

      - NEO4J_AUTH=neo4j/p@ssw0rd

Legen Sie das neo4j-Passwort fest

      - EXTENSION_SCRIPT=/tmp/background.sh

Ich habe dieses EXTENSION_SCRIPT nicht verstanden. Das Neo4j-Handbuch sagt nicht, wofür es verwendet wird, und in anderen Artikeln heißt es, dass es sich um ein Skript handelt, das nach dem Start von Neo4j ausgeführt wird. Betrachtet man das tatsächliche Verhalten, so scheint es, dass es vor dem Start von Neo4j und nicht nach dem Start ausgeführt wird. Darüber hinaus scheint Neo4j erst zu starten, wenn dieses Skript normal endet. Daher wird dieses Mal init.sh (mit &) in background.sh ausgeführt. Dann startet Neo4j sicher und init.sh wartet, bis Neo4j im Hintergrund gestartet und die Anfangsdaten eingerichtet wurden. Das Ausführen von init.sh mit & in EXTENSION_SCRIPT hat übrigens nicht funktioniert.

Dockerfile

FROM neo4j:4.1.3

RUN apt-get update
RUN apt-get install -y curl
COPY init.cypher /tmp/init.cypher
COPY background.sh /tmp/background.sh
COPY init.sh /tmp/init.sh
RUN chmod -v +x /tmp/background.sh
RUN chmod -v +x /tmp/init.sh

Wenn das neo4j-Image bereitgestellt wird, ist die Paketliste von apt-get leer, sodass das Paket nur installiert werden kann, wenn das apt-get-Update einmal ausgeführt wurde. Hier wird curl installiert, um den Start von Neo4j zu überprüfen (prüfen Sie, ob Cypher ausgeführt werden kann). Wenn Sie sich in einer Proxy-Umgebung befinden, fügen Sie hier "ENV http_proxy http: // hogehoge" usw. hinzu, und es sollte funktionieren.

background.sh

background.sh


#!/bin/bash

/tmp/init.sh &

Wie oben erläutert, eine Shell, die Sie nur EXTENSION_SCRIPT angeben und init.sh im Hintergrund ausführen möchten. Dies ist init.sh, und ich bin der Meinung, dass background.sh korrekter ist als init.sh, das später beschrieben wird.

init.sh

init.sh


#!/bin/bash

if [ -f /init/done ]; then
    echo "The initialization process is already completed." >> /init/setup.log
    exit 1
fi

COUNT=1

while [ $COUNT -lt 20 ]; do

  status_code=$(curl --write-out %{http_code} --silent --output /dev/null localhost:7474)
  if [[ "$status_code" = 200 ]] ; then
    touch /init/done
    cypher-shell -u neo4j -p p@ssw0rd -f /tmp/init.cypher
    echo "The initialization process is complete." >> /init/setup.log
    exit 1
  else
    echo "The neo4j service has not started yet. [$COUNT]" >> /init/setup.log
  fi

  COUNT=$(expr $COUNT + 1)
  sleep 10s

done

exit 0

Diese Shell ist ein Skript zur Eingabe von Anfangsdaten in das gestartete Neo4j. Da dieses Skript jedoch zwangsläufig jedes Mal ausgeführt wird, wenn Docker-Compose ausgeführt wird, wird bei der ersten Ausführung eine Datei mit dem Namen / init / done erstellt. Wenn diese Datei vorhanden ist, wird sie beendet, ohne dass etwas unternommen wird.

Kommentar
if [ -f /init/done ]; then
    echo "The initialization process is already completed." >> /init/setup.log
    exit 1
fi

Überprüfen Sie die Existenz von / init / done in diesem Teil, und führen Sie gegebenenfalls die nachfolgende Verarbeitung durch.

while [ $COUNT -lt 20 ]; do

Wiederholen Sie den Vorgang 20 Mal (streng 19 Mal mit diesem Code), bis Neo4j startet.

  status_code=$(curl --write-out %{http_code} --silent --output /dev/null localhost:7474)

Greifen Sie mit curl auf http: // localhost: 7474 zu und rufen Sie den HTTP-Antwortcode ab.

  if [[ "$status_code" = 200 ]] ; then
    touch /init/done
    cypher-shell -u neo4j -p p@ssw0rd -f /tmp/init.cypher
    echo "The initialization process is complete." >> /init/setup.log
    exit 1
  else
    echo "The neo4j service has not started yet. [$COUNT]" >> /init/setup.log
  fi

Wenn das Ergebnis von curl 200 ist, erstellen Sie / init / done und führen Sie /tmp/init.cypher mit dem Befehl cypher-shell aus. Wenn es nicht 200 ist, tun Sie nichts und versuchen Sie es erneut.

  COUNT=$(expr $COUNT + 1)
  sleep 10s

Zählen Sie hoch und schlafen Sie 10 Sekunden lang. Übrigens war ((COUNT ++)) nicht zum Aufzählen in Neo4j-Bildern verfügbar.

init.cypher

MATCH (n) return n;

Ersteinrichtung Cypher. Hier wird die gesamte Knotenerfassung als Beispiel geschrieben, in Wirklichkeit wird jedoch eine CREATE-Anweisung usw. geschrieben.

Wenn diese init.sh erfolgreich ausgeführt wird, wird das folgende Protokoll in setup.log unter / init (volume / neo4j / init) ausgegeben, und es sollte auch eine fertige Datei generiert werden.

setup.log


The neo4j service has not started yet. [1]
The neo4j service has not started yet. [2]
The neo4j service has not started yet. [3]
The initialization process is complete.

Recommended Posts

Docker-Compose Bereitstellung von Neo4j mit APOC
Fehler beim Bereitstellen von Rails5 + MySQL auf Heroku mit Docker-Compose
Starten Sie k3s mit Docker-Compose
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
Vorsichtsmaßnahmen beim Erstellen von PostgreSQL mit Docker-Compose
DB-Fehler bei der Bereitstellung mit Heroku
Container startet nicht mit Docker-Compose