Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

Haskell入門の10章をDocker化する

Haskell入門 の10章は、 SQLite への依存があったりして Windows で試すのは若干面倒だったので、 Docker for Windows で試せるようにした。

https://github.com/hiratara/Haskell-Nyumon-Sample/compare/docker/chap10

docker/chap10 ブランチを持ってきて、Docker for Windows が動いている環境でこんな感じで動かせる。

$ docker-compose build
$ docker-compose run --rm --service-ports weight-recorder

# ソースをいじって stack build したいとき
$ docker-compose run --rm weight-recorder build weight-recorder

docker hubに stack dockerコマンド用のイメージがある ので、LTSが一致しているものを持ってきてベースイメージにしている。なお、残念ながら stack dockerコマンドはWindows非対応 なので今回の目的には使えない。

Windowsで作業ディレクトリを単純にバインドマインティングすると、

Installing executable(s) in
/work/.stack-work/install/x86_64-linux/lts-8.24/8.0.2/bin
/work/.stack-work/install/x86_64-linux/lts-8.24/8.0.2/bin/.copyFile5117023052084420925.tmp:
copyFile: hardware fault (Input/output error)
Completed 2 action(s).

のように微妙なエラーが出たりすることがあるので、 docker-compose でデータボリュームを作ったりしている。後、何も考えずに Docker 化すると、docker-compose build 時の stack の初期化が時間がかかりすぎてあまりにも辛いので、キャッシュが働くように COPY 前にある程度パッケージをビルドするようにしてたりする。

後、かんたんのためにDBを作業ディレクトリに置いていたのがきつくなったので、軽く手を入れて環境変数から指定できるようにした。 /data 以下にDBを置いている。