blog.bouzuya.net

2017-05-06 stack docker をためすなど

bouzuya/bbn-json-hs をつくっている。公開分は stack new しただけのものだけど……。

bbn-json-hs は blog.bouzuya.net へ JSON を取得しにいき、簡素化した JSON を返す API server ……になる予定。特に難しい要素はない。簡単なリクエストの処理・外部サービスとの通信・レスポンスの JSON の構築、あとはインフラや CI などを確かめたかった。

あわせて stack docker をためした。 Docker 内で stack のサブコマンドを実行してくれる。詳細は Docker integration - The Haskell Tool Stack を参照。

stack.yamldocker: enable: true を入れれば有効になる。確かに Docker コンテナ内で実行してくれるのだけど、ビルドされたものや依存関係にあるパッケージなどはすべて Docker コンテナの外(ホスト)側にあって、 volume でマウントしている。だから、そのイメージだけを別の場所に持っていって使えるわけではない。うーん。 persist オプションなどを工夫すればできそうだけど、面倒くさそうだ。

有効にしている場合、ほかの問題がある。別で Dockerfile をつくったときも、コンテナの内側で stack build すると stack.yamldocker: enable: true が書いてあるものだから、docker の中で docker を使おうとしてしまう。うーん。コマンドラインに指定するか……。そこまでしてほしくもないし、そこまで動きに差が出ないだろうと信じて、結局 stack docker は無効に戻した。

Dockerfile は特に工夫していない。stack setup して stack build するだけのものだ。本来は $HOME/.stack のキャッシュを目的として *.cabal などのタイムスタンプを調整したりしないといけないんだろうけど、面倒なので割愛した。何度も依存関係にあるパッケージをビルドすることになり、検証にひどく時間がかかった。

検索していると Dockerfile には cabal を用いたものばかりで stack を用いたものは見かけなかった。時期や容量の問題なのだろうか。ぼくは面倒なので stack で進めている。イメージも stack build で使われているものをそのまま使っている。手抜きだ。

本当は、今日中にもうすこしつくって Heroku や ECS に載せるつもりだったのだけど、ダメだった。とりあえず、つくるものは決めたので、ゴールデンウィーク最終日の明日こそは。