blockdiagがMacOSXにサクッとインストールできなかったのでそれ用のDockerイメージを作る


「よろしい、ならばDockerだ」案件。

blockdiagとは?

MacOSXでDockerを利用する

boot2dockerを使う。がんばってインスコ。この部分の細かいことは割愛。
http://docs.docker.com/installation/mac/

blockdiag実行可能なimageを作成する

インストールパッケージが過不足ないかは未確認。とりあえず動くVersion。

Dockerfile
FROM centos:centos6
MAINTAINER kozy4324 <[email protected]>
RUN yum install -y gcc zlib-devel freetype-devel tkinter python-devel python-setuptools python-imaging ipa-gothic-fonts
RUN easy_install blockdiag
RUN echo "[blockdiag]" > $HOME/.blockdiagrc
RUN echo "fontpath = /usr/share/fonts/ipa-gothic/ipag.ttf" >> $HOME/.blockdiagrc

このファイルがあるディレクトリで以下コマンド実行。

$ docker build -t kozy4324/blockdiag:1.0 .

問題なく実行できればimageがローカルに出来ているはず。

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
kozy4324/blockdiag   1.0                 45f55ed1d843        12 minutes ago      440.8 MB
centos               centos6             510cf09a7986        3 weeks ago         202.6 MB

実行

ドキュメントページのサンプルをコピってくる。font設定も確認したかったので日本語を含んでいるもの。ホスト側(というかMacOSX側か、ややこしい)に以下ファイルを作成。

a.diag
blockdiag admin {
   // Set M17N text using label property.
   A [label = "起"];
   B [label = "承"];
   C [label = "転"];
   D [label = "結"];

   A -> B -> C -> D;

   // Use M17N text directly (need to quote).
   春 -> 夏 -> 秋 -> 冬;

   // Use M17N text including symbol characters (need to quote).
   "春は 曙" -> "夏 = 夜" -> "秋.夕暮れ" -> "冬 & つとめて";
}

このa.diagがあるディレクトリで実行。とりあえず以下な感じで。

$ docker run -v $(pwd):/host kozy4324/blockdiag:1.0 /bin/bash -c "cd /host; blockdiag *.diag"

これで以下のa.pngが出力される。

-vでホスト側とコンテナ側でディレクトリ(カレント)を共有して、コンテナ側のその共有したディレクトリ内でコマンド実行してみたという。ホスト側のファイルを入力にしてコンテナ側でプログラム実行する良いやり方ないのかしら?

2回目以降の実行

毎回$ docker runしちゃうと実行済みコンテナがゴミのごとく溜まってウザい。

$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED              STATUS                      PORTS               NAMES
8686eb236bed        kozy4324/blockdiag:1.0   "/bin/bash -c 'cd /h   3 seconds ago        Exited (0) 2 seconds ago                        boring_pike         
753add1a3804        kozy4324/blockdiag:1.0   "/bin/bash -c 'cd /h   5 seconds ago        Exited (0) 4 seconds ago                        silly_bell          
71d2348acd80        kozy4324/blockdiag:1.0   "/bin/bash -c 'cd /h   About a minute ago   Exited (0) 16 seconds ago                       drunk_goldstine     

とりあえず全部削除。

$ docker rm $(docker ps -a -q)

(一度実行している体で)コンテナIDを指定して$ docker startで実行したほうがゴミが溜まらなくてよいかも。

$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                     PORTS               NAMES
7e2d612435dc        kozy4324/blockdiag:1.0   "/bin/bash -c 'cd /h   9 seconds ago       Exited (0) 8 seconds ago                       boring_mayer        

$ docker start 7e2d612435dc
7e2d612435dc

Docker Hubにpushしておく

$ docker push kozy4324/blockdiag:1.0

まとめ

  • 使いたいコマンドが依存関係ミスってMacOSXにインストールできない場合、Dockerは良い
  • Dockerfileあるし、Docker Hubにもpushしてあるので環境のポータビリティは良い

    $ docker pull kozy4324/blockdiag
    
  • ホスト側のファイルを入力にしてコンテナ側でプログラム実行する良いやり方ないのかしら?