neo4jとPythonとそしてDocker
はじめに
作りたい物で neo4j と Python を使うことになったので
開発環境を作ることにした.
せっかくなので Docker も使ってポータブルな環境を構築する.
環境情報
- OSX HighSierra(10.13)
- Docker (17.09.0-ce-mac35 (19611))
- docker-compose (1.16.1, build 6d1ac21)
- Python 3.7
- neo4j 3.2.5
neo4j の準備
開発環境なので, 下記の内容で Docker-Compose.yml
を作成する.
neo4j: image: neo4j:3.2.5 ports: - 7474:7474 - 7687:7687 volumes: - ${HOME}/WorkSpace/program/neo4j/data:/data
docker-compose.yml
があるディレクトリで下記を実行.
> docker pull neo4j:3.2.5 > docker-compose up
起動して Remote Interface available at ...
というログが出てきて,
ブラウザからログインできるようになっていれば問題ない.
Python の準備
neo4jへのアクセスには neo4j-driver
を用いる. まずは Python のDockerイメージを取得する.
今回は AlpineLinux ベースのイメージを利用する.
> docker pull python:3.7.0a2-alpine
次に適当なディレクトリで Dockerfile を製作する.
FROM python:3.7.0a2-alpine RUN mkdir -p /pywork/ WORKDIR /pywork COPY ./requirements.txt ./ RUN pip install -r requirements.txt
構築時にpipでインストールするパッケージのリストを requirements.txt
として同ディレクトリに用意する.
neo4j-driver
今回はこれだけである.
次に image のビルドを行う.
> docker build -t orig/python ./
コンテナを起動して正常動作を確認する(neo4j のコンテナも起動しているものとする).
> docker run -it --link neo4j_neo4j_1:neo4j amane/python3.7 /bin/sh >> python >>> from neo4j.v1 import GraphDatabase, basic_auth >>> driver = GraphDatabase.driver("bolt://neo4j:7687", auth=basic_auth("neo4j", "neo4j_password")) >>> session = driver.session() >>> session.run("CREATE (a:Person {name: {name}, age: {age}})", {"name": "alice", "age": 19})
これでノードが作成されていることを確認できたら動作確認は完了である.
neo4j と Python のコンテナ連携
現状では Docker が再起動した際に neo4j と python を個別に起動してごにょごにょする必要がある.
さらに Python のコンテナについてはスクリプトを編集する度にリビルドしなければならない.
これは面倒なので, とりあえず docker-compose でまとめることを考える.
docker-compose.yml
は以下の通り.
neo4j: image: neo4j:3.2.5 ports: - 7474:7474 - 7687:7687 volumes: - ${HOME}/WorkSpace/program/neo4j/data:/data python: build: python/ volumes: - ./python/src:/app links: - neo4j command: python /app/app.py
Python コンテナ用の Dockerfile
は以下の通り.
FROM python:3.7.0a2-alpine RUN mkdir -p /app ; adduser -H -D app && addgroup app app WORKDIR /app COPY ./requirements.txt ./ COPY src /app RUN pip install -r requirements.txt USER app
現状ではPythonのコンテナの方が起動が圧倒的に早く,
neo4jのインターフェイスの準備が完了する前にスクリプトの実行が行われてしまう.
必要な対策として neo4j のインターフェイスが準備できるまで Python側かDockerの機能で待機を行う必要がある.
これについてはまた追って調査することとする.
また, neo4j のパスワードが平文埋め込みなので docker scretなどを用いた手法に変更したい.
おわりに
今回はグラフ型データベースである neo4j と Python の連携をDocker上で実施できるような仕組みを作成した.
次の段階は Python側で neo4j データベースを操作するWebUIを作ることになるだろう.
参考文献
参考文献です. 順不同(ブラウザで開いてた順です).
- Neo4j Docker版を動かしてみました
- Dockerでneo4jを動かす際に参考にさせていただきました
- Using Neo4j from Python
- neo4jの公式サイトで, Pythonからneo4jを利用する手段について記載されています
- Docker の Data Volume まわりを整理する
- Dockerのボリューム周りで参考にさせていただきました
- Docker の基本学習 ~ コンテナ間のリンク
- Dockerのコンテナ間でのリンクを行うための事項について記載されています
- Dockerfileリファレンス
- Dockerfileを作成する際ににらめっこさせていただきました
- 効率的に安全な Dockerfile を作るには
- Dockerfileの設計に関するベストプラクティスについて記載されています
- コマンドライン起動系のPythonのプロジェクトをDockerコンテナに入れる個人的ベストプラクティス
- Pythonコンテナを作成する際に参考にさせていただきました