Docker-compose déployer Neo4j avec APOC

introduction

Bien que le nombre de personnes utilisant Neo4j ait augmenté, il n'est toujours pas reconnu. Puisque Neo4j Desktop est disponible sur Windows, il n'est pas gênant à utiliser, mais si vous créez une application simple et la distribuez à une équipe, il faudra beaucoup d'espace pour créer une image, il est donc plus facile d'utiliser Docker. Surtout lorsque vous travaillez à distance comme maintenant. Donc, quand j'ai essayé de le distribuer en tant qu'ensemble avec l'application avec docker-compose, il n'y avait pas beaucoup d'informations sur le docker pour neo4j, alors j'ai cherché ~~ Je posterai ce qui fonctionnait de différentes manières comme rappel.

Structure des dossiers

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
Commentaire
#      - NEO4JLABS_PLUGINS=["apoc"]

Si vous décommentez cette partie, apoc.jar sera automatiquement téléchargé à partir d'Internet. Cette fois, apoc.jar est stocké dans le dossier volumes / neo4j / plugins depuis le début, il n'est donc pas nécessaire de le télécharger, je l'ai donc commenté. Le téléchargement de apoc.jar prend beaucoup de temps, donc utiliser celui que vous avez téléchargé à l'avance peut raccourcir le temps de démarrage. Cependant, l'activation de cette fonctionnalité présente un avantage. Cette fois, neo4j: 4.1.3 (le dernier en date du 15 octobre 2020 est 4.1.3) est utilisé pour l'image Neo4j Docker, mais comme il existe une version d'apoc.jar correspondant à la version neo4j, elle est combinée. Cela peut ne pas fonctionner selon la situation. Si vous supprimez ce commentaire, apoc.jar correspondant à l'image Neo4j que vous utilisez sera automatiquement identifié et installé.

      - NEO4J_AUTH=neo4j/p@ssw0rd

Définir le mot de passe neo4j

      - EXTENSION_SCRIPT=/tmp/background.sh

Je n'ai pas compris ce EXTENSION_SCRIPT. Le manuel Neo4j ne dit pas à quoi il sert, et les articles d'autres personnes disent que c'est un script qui s'exécute après le démarrage de Neo4j. En regardant le comportement réel, il semble qu'il soit exécuté avant le démarrage de Neo4j plutôt qu'après son démarrage. De plus, il semble que Neo4j ne démarrera que si ce script se termine normalement. Par conséquent, cette fois, init.sh est exécuté (avec &) dans background.sh. Ensuite, Neo4j démarrera en toute sécurité, et init.sh attendra que Neo4j démarre en arrière-plan et configure les données initiales. Au fait, exécuter init.sh avec & dans EXTENSION_SCRIPT ne fonctionnait pas.

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

Lorsque l'image neo4j est déployée, la liste des packages d'apt-get est vide, le package ne peut donc pas être installé à moins que la mise à jour apt-get ne soit exécutée une fois. Ici, curl est installé pour vérifier le démarrage de Neo4j (vérifier si Cypher peut être exécuté). Si vous êtes dans un environnement Proxy, ajoutez ici ʻENV http_proxy http: // hogehoge` etc. et cela devrait fonctionner.

background.sh

background.sh


#!/bin/bash

/tmp/init.sh &

Comme expliqué ci-dessus, un shell que vous souhaitez simplement spécifier EXTENSION_SCRIPT et exécuter init.sh en arrière-plan. C'est init.sh, et je pense que background.sh est plus correct que init.sh, qui sera décrit plus tard.

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

Ce shell est un script pour entrer les données initiales dans le Neo4j démarré. Cependant, comme ce script est inévitablement exécuté à chaque fois que docker-compose est exécuté, un fichier appelé / init / done est créé lorsqu'il est exécuté pour la première fois, et si ce fichier existe, il se termine sans rien faire.

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

Vérifiez l'existence de / init / done dans cette partie, et s'il y en a, terminez, sinon, effectuez un traitement ultérieur.

while [ $COUNT -lt 20 ]; do

Réessayez 20 fois (strictement 19 fois avec ce code) jusqu'à ce que Neo4j démarre.

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

Accédez à http: // localhost: 7474 avec curl et obtenez le code de réponse HTTP.

  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

Si le résultat de curl est 200, créez / init / done et exécutez /tmp/init.cypher avec la commande cypher-shell. Si ce n'est pas 200, ne faites rien et réessayez.

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

Comptez et dormez pendant 10 secondes. À propos, (COUNT ++)) n'était pas disponible pour le comptage dans les images Neo4j.

init.cypher

MATCH (n) return n;

Configuration initiale Cypher. Ici, toutes les acquisitions de nœuds sont écrites comme un exemple, mais en réalité, une instruction CREATE etc. est écrite.

Si ce fichier init.sh est exécuté avec succès, le journal suivant sera affiché dans setup.log sous / init (volumes / neo4j / init), et un fichier done devrait également être généré.

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 déployer Neo4j avec APOC
Erreur lors du déploiement de rails5 + Mysql sur heroku avec Docker-compose
Démarrez k3s avec docker-compose
Exécuter un lot avec docker-compose avec Java batch
Précautions lors de la création de PostgreSQL avec docker-compose
Erreur de base de données concernant le déploiement à l'aide d'Heroku
Le conteneur ne commence pas par docker-compose