「よろしい、ならばDockerだ」案件。
blockdiagとは?
MacOSXでDockerを利用する
boot2dockerを使う。がんばってインスコ。この部分の細かいことは割愛。
http://docs.docker.com/installation/mac/
blockdiag実行可能なimageを作成する
インストールパッケージが過不足ないかは未確認。とりあえず動くVersion。
FROM centos:centos6
MAINTAINER kozy4324 <kozy4324@gmail.com>
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側か、ややこしい)に以下ファイルを作成。
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
-
ホスト側のファイルを入力にしてコンテナ側でプログラム実行する良いやり方ないのかしら?