*iroi*

mechairoi の Blog

Docker を使って Haskell を Heroku の cedar stack 用にコンパイルする

Heroku で Haskell を動かす方法は http://daimatz.hateblo.jp/entry/2013/02/09/164531 のように buildpack を使うとデプロイ時に Heroku のホストでビルドできて便利です。しかしビルド時間が15分までで Yesod などを使っていると間に合わず、手元で Ubuntu 10.04 向けのバイナリを作って push などする必要があります。Ubuntu 10.04 で開発してる人はもうあまりいないと思いますので、最近流行っている Docker を使って cedar stack 向けにビルドできるようにしてみました。

ビルドに使う Docker image は cedar 用のものに ghc と cabal-install をインストールして作りました。

サンプルプロジェクトは

にあります。デプロイするには READMEに書いてある通り、docker とか heroku コマンドをインストールして、リポジトリをクローンして

git clone https://github.com/mechairoi/docker-heroku-cedar-ghc.git

Heroku の アプリケーションを作って、

heroku create --stack=cedar

ビルドしてpush すれば

make build
git checkout -b deploy
git add -f dist/build/heroku-haskell/heroku-haskell
git commit -m "build"
git push heroku deploy:master

デプロイできると思います。Yesod でも deploy/Procfile に従って package.json などを配置して Makefile を修正すれば動くはずです。

make build の中身は

sudo docker run -v ${PWD}:/workspace -t mechairoi/heroku-cedar-ghc /bin/bash -xc 'cd /workspace/ \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config sandbox --sandbox=/workspace/.heroku-cabal-sandbox init \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config install --dependencies-only \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config configure \
	  && cabal --sandbox-config-file=./heroku.cabal.sandbox.config build --builddir=./dist-heroku \
	  && strip --strip-unneeded ./dist-heroku/build/heroku-haskell/heroku-haskell'

のようになっていて、Docker のホスト側をマウントして cabal sandbox を作ってるので2回目からはパッケージのダウンロードもなくビルドできます。Vagrant と違って起動も早いし Docker 便利ですね。