nginx Container for Heroku Docker

Heroku App を Docker でビルド + デプロイできる機能が Beta として公開されています。

https://devcenter.heroku.com/articles/docker

これがどんなものかを理解するために、手始めに nginx で静的サイトを捌く Image を作ってみました。

Docker Image の使い方

使い方は至ってシンプルです。

Heroku Toolbelt が入っていなければそれを、その次に Heroku Docker CLI plugin をインストールします。

brew install heroku-toolbelt
heroku plugins:install heroku-docker
heroku login

プロジェクトを作成します。

echo 'web: ./nginx-start.sh' > Procfile
mkdir www
echo '<html><body><h1>It works</h1></body></html>' > www/index.html
heroku docker:init --image atsnngs/heroku-nginx
docker-compose build

www 配下が Document Root になっているので、その中にサイトを構築します。

ローカルでコンテナを立ち上げてブラウザで開いてみます。

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

Heroku App を作ってデプロイします。 heroku コマンドを使うのに、 Git リポジトリである必要があるので、git init でリポジトリにします。

git init .
heroku create
heroku docker:release
heroku open

ブラウザで Heroku 上に動いているサイトが確認できたと思います。

Image 構築でやっていること

Docker イメージを構築する上で、Heroku App の Slug に積まれるファイルは /app 配下である必要がありました。

参照: Build and Deploy with Docker / Advanced uses

apt-get でインストールしたパッケージや、/etc に入っている設定ファイルなどは、デプロイされません。

そのため、/app/.heroku/nginx をルートディレクトリに設定した nginx を自前でビルドして、 そのバイナリの Tarball を Image のビルド時にダウンロードしてくる様にしました。

RUN curl --silent --location https://github.com/ngs/heroku-docker-nginx/raw/master/nginx.tar.gz | tar xz -C /app/.heroku/nginx/sbin

所感

この様に、普通の Docker の使い方ができず、Buildpack の方が、シンプルで使いやすいです。

また、CircleCI の Docker Engine は 1.6 で、Docker Plugin が使っている docker-compose は 1.7 が要件に入っています。なので、CI ビルドから Docker Plugin でアプリケーションをリリースすることはできません。

諸々、Beta 卒業の頃には解決する問題だと願っていますが、敢えて、今 Heroku Docker を採用する理由はないと思いました。

comments powered by Disqus