電脳世界のケーキ屋さん

考えの甘い甘党エンジニアがいろいろ書くブログ

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を作ることになるだろう.

参考文献

参考文献です. 順不同(ブラウザで開いてた順です).