[Python] Dockerでpygraphvizをインストールする

この記事では,PythonにpygraphvizをDocker, docker-compose.ymlを用いてインストールする方法を紹介する.また,Dockerのイメージにはjupyter notebookのofficial image(datascience notebook)などを用いるようにする.

pygraphvizはGraphvizのラッパーで,マルチプラットフォームのgraphvizをPythonから使えるようにする.ネットワーク解析のpackageにはNetworkXもあってそっちの方が分析的な側面は強いが,図の綺麗さ,optionの多さではGraphvizには叶わない.そこでなんとかしてDockerにpygraphvizを入れるお話.

方針

Pygraphvizのインスール方法を紹介するページはいくつかある.

もっと簡単に、pygraphvizをWindows10 64bitでインストールする(Python3)
graphvizをインストールできない時の解決法
Install, Pygraphviz Official site

pipですぐに入れられると思いきや,Graphviz本体のインストールに以外と手間取る,また,pygraphvizにGraphvizの位置を教えるのにも手間が掛かる状態だ.

結論から言うと,シンプルなDockerfileとdocker-compose.ymlの方法での解決方法は分からず,更にinstall.shを用意して,Imageを立ち上げた後に,Containerにpygraphvizを用意するという手順を取った.

やり方

Dockerfileはただ,imageを読むこむだけ.

FROM jupyter/datascience-notebook:lab-3.4.3

WORKDIR /workdir
EXPOSE 8888

docker-compose.ymlには,jupyterのimageを立ち上げた後にsudoを使えるようにするために,user: 0:0とGRANT_SUDO=yesを有効にする.

version: "3"
services:
  lab:
    container_name: pygraphviz_container

    build:
        context: .
        dockerfile: ./Dockerfile

    ports:
      - "8888:8888"

    user: 0:0
    environment:
      - JUPYTER_ENABLE_LAB=yes
      - GRANT_SUDO=yes

    volumes:
      - .:/workdir

    command: start.sh jupyter lab

この方法に関してはこの記事参照.
How to configure docker-compose.yml to up a container as root
注: この方法だとsudoをパスワード無しで実行出来るようになるのでRemote環境など自分以外がアクセス出来る環境での立ち上げはお避けください.

そして,コンテナを立ち上げたあとに,Jupyter labの画面からterminalを開いて以下のinstall.shを回す.

sudo apt-get dist-upgrade -y
sudo apt-get update -y 
sudo apt-get install build-essential -y
sudo apt-get install graphviz graphviz-dev -y

sudo pip install --global-option=build_ext \
                 --global-option="-L/usr/share" \
                 --global-option="-R/usr/share" \
                 pygraphviz 

これは,graphvizのインストールとそのインストールパスをpygraphvizに教える.これでノートブックを開いて,例えば以下のコードが回るようになる.

import pygraphviz as pgv

# strict (no parallel edges)
# digraph
# with attribute rankdir set to 'LR'
A = pgv.AGraph(directed=True, strict=True, rankdir="LR")
# add node 1 with color red
A.add_node(1, color="red")
A.add_node(5, color="blue")
# add some edges
A.add_edge(1, 2, color="green")
A.add_edge(2, 3)
A.add_edge(1, 3)
A.add_edge(3, 4)
A.add_edge(3, 5)
A.add_edge(3, 6)
A.add_edge(4, 6)
# adjust a graph parameter
A.graph_attr["epsilon"] = "0.001"
print(A.string())  # print dot file to standard output
A.layout("dot")  # layout with dot
A.draw("foo.png")  # write to file

これで,pygraphvizを他の計算科学系ライブラリーと一緒に取り扱えるようになる.もちろん,この方法だとimageにpygraphvizが入っているわけではないので,docker-compose downなどすると,もう一度install.shを回さなければいけないのが玉に傷だが,使える方が大事だろう.

———-雑感(`・ω・´)———-

これで,Windowsだから,Macだからなどで,Graphvizのインストールで困ることはなくなった.凄い手間が楽になった.

ちなみに日本語文字化けに関しては,.svgで保存するととりあえず解決するよう.
簡単にPyGraphvizとNetworkxで自由なフォントを使ってグラフを作画する(Python3 Windows10 64bit)

だれかDockerfileでsudoコマンドを実行する方法分かったら,コメントなどで教えてください.

コメント

タイトルとURLをコピーしました