Introducing 'heroku docker:release': Build & Deploy Heroku Apps with Docker
HerokuがDockerを使ったツールを提供し始めた.中身を追ってみて( "Herokuの'docker:release'の動き")いろいろできそうだったので遊んでみた.
-
tcnksm/gox-server,Heroku上にGo言語のクロスコンパイル環境を立てた.
curl -A "uname -sp" https://gox-server.herokuapp.com/Soulou/curl-unix-socket
みたいなリクエスト投げると環境にあったバイナリをビルドしてダウンロードできる -
tcnksm/heroku-docker-registry,Heroku上でDocker Registryを立てた.普通に
push
やpull
できる.バックエンドドライバーを変えれば普通に使えるかも
あとコードは公開してないないけどApache KafkaといったJVM系のツールも動かしてみた.他にも以下のようなものをインターネットで見かけた.
Tips
いくつか書いてみてハマりそうなことをまとめておく(まだリリースされたばかりなのでそのうち変わると思う).できることや内部の動きとかは"Herokuの'docker:release'の動き"に書いた.また気づきがあれば追記する.
最低条件
とりあえず以下は満たす必要がある.
-
heroku:cedar:14
イメージを使う - 変更は全て
/app
以下に入るようにする
(/app
以下に入れる必要があるのはリリースするSlugが/app
の.tgz
なので)
デバッグ
heroku docker:relase
でアプリケーションを起動するが普通にDockerコンテナが動いているだけなので中に入れる.コンテナの名前はheroku-docker-${hash}-start
になる.
$ docker run -it heroku-docker-${hash}-start /bin/bash
動いているコンテナに入りたい場合はdocker exec
を使う.
Slugのサイズ
リリースするSlugのサイズは300MB以下である必要がある(https://devcenter.heroku.com/articles/slug-compiler#slug-size).作ってるやつがちゃんとそれを満たしているかを確かめるには以下を実行すれば良い.
$ docker run -it heroku-docker-${hash}-start /bin/bash
$ tar cfvz /tmp/slug.tgz -C / --exclude=.git --exclude=.heroku ./app
$ ls -lh /tmp/slug.tgz
(tar
コマンドはheroku docker:relase
が内部で実行するコマンドそのもの)
apt-get
意味ない.ローカルでは使えるけどHerokuに上げたときに使えない.なのでソースコンパイルして依存すべて含めて/app
以下にインストールされるように頑張る.
Procfile
Procfile
に起動コマンドを書くが,ここに$PORT
環境変数を書くとHeroku上では動くがローカル環境ではうまく動かないかもしれない.Procfile
はローカルではdocker run
の引数として展開されるだけで,ここに環境変数が書いてあるとホストの環境変数を読んでしまう.両方の環境で動かしたいならProcfile以外から環境変数を読むようにする.
なのでProcfile
にはrun.sh
とだけ書いてrun.sh
内で$PORT
環境変数を読んで設定ファイルを書き換えるとかしてる(他に良いやりかたがあれば教えて下さい).
WORKDIR
WORKDIR
でコマンド実行時の起点となるディレクトリを設定するが,ローカルでは動いてもHeroku上では動かない.procfile.d
をちゃんと書く必要がある.例えばWORKDIR
を/app/bin
にしたのであれば以下をDockerfile
に書く必要がある.
ONBUILD RUN echo "cd /app/bin" >> /app/.profile.d/init.sh
まとめ
頑張れば何でも動かせる気がする.