43
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Heroku用のDockerfileを書く時のTips

Last updated at Posted at 2015-05-15

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を立てた.普通にpushpullできる.バックエンドドライバーを変えれば普通に使えるかも

あとコードは公開してないないけど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

まとめ

頑張れば何でも動かせる気がする.

43
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?