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.yaml
に docker: enable: true
を入れれば有効になる。確かに Docker コンテナ内で実行してくれるのだけど、ビルドされたものや依存関係にあるパッケージなどはすべて Docker コンテナの外(ホスト)側にあって、 volume でマウントしている。だから、そのイメージだけを別の場所に持っていって使えるわけではない。うーん。 persist
オプションなどを工夫すればできそうだけど、面倒くさそうだ。
有効にしている場合、ほかの問題がある。別で Dockerfile
をつくったときも、コンテナの内側で stack build
すると stack.yaml
に docker: enable: true
が書いてあるものだから、docker
の中で docker
を使おうとしてしまう。うーん。コマンドラインに指定するか……。そこまでしてほしくもないし、そこまで動きに差が出ないだろうと信じて、結局 stack docker
は無効に戻した。
Dockerfile
は特に工夫していない。stack setup
して stack build
するだけのものだ。本来は $HOME/.stack
のキャッシュを目的として *.cabal
などのタイムスタンプを調整したりしないといけないんだろうけど、面倒なので割愛した。何度も依存関係にあるパッケージをビルドすることになり、検証にひどく時間がかかった。
検索していると Dockerfile
には cabal
を用いたものばかりで stack
を用いたものは見かけなかった。時期や容量の問題なのだろうか。ぼくは面倒なので stack
で進めている。イメージも stack build
で使われているものをそのまま使っている。手抜きだ。
本当は、今日中にもうすこしつくって Heroku や ECS に載せるつもりだったのだけど、ダメだった。とりあえず、つくるものは決めたので、ゴールデンウィーク最終日の明日こそは。