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.
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
# - 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.
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