DockerでHerokuの環境を再現する

はじめに

2015 tech-yuruyuru アドベントカレンダー - connpass 13日目です。

PythonのWebアプリを開発するとき、Mac上でそのまま開発することが多いんですがHerokuに近い環境で動作確認もしたい。 Heroku-toolbeltの中にDockerfileを生成してくれるコマンドがあるみたいなので試してみる。

ここをザッと読む限り app.json ファイルにプロジェクトの構成を記述すればHeroku-Toolbeltから簡単にDockerfileが生成出来るみたいなので試してみる。

Dockerfileの作成

heroku-toolbeltに heroku-docker プラグインをインストール。

$ heroku plugins:install heroku-docker

python版のdocker-imageは↓にあるみたい。

app.jsonの用意

{
  "name": "python/flask docker environment",
  "description": "Docker configulation for run python/flask application.",
  "image": "heroku/python",
  "addons": [ "heroku-postgresql" ]
}

Procfileと他の設定ファイルも用意

Procfile

# Flask
web: gunicorn manage:app -w 1 --log-file -

runtime.txt: デフォルトでは2系なので指定。もう3.5が使える。

python-3.5.0

requirements.txt

$ pip freeze > requirements.txt

Dockerfile生成

Dockerfileとdocker-compose.ymlを生成

$ heroku docker:init

実行

docker-machineを起動してIPアドレスをdocker-daemonに伝える(手順は省略)。

$ docker-compose up web
$ open "http://$(docker-machine ip default):8080"

docker-compose up web が何度も失敗して不思議だったけどdocker-machineをrestartしたら上手くいった。 ただしブラウザでアクセスしてもつながらない

python2系だと上手くいく。

その他

  • shell
$ docker-compose run shell
  • コンテナのrebuild
$ docker-compose build
  • デプロイ

heroku docker:release が使える。それ以外は今まで通り

$ heroku create          # 登録
$ heroku docker:release  # リリース
$ heroku open            # ブラウザで開く
$ heroku logs            # ログの確認
$ heroku run python      # pythonの実行

おわりに

ギリギリ13日目...

今のところ、変更があるたびにdocker buildし直すのは面倒そうなので、開発は基本的にMac上で直接行うつもり。