概要

Nginx の Docker イメージを Heroku へデプロイする方法について。

ベースイメージの作成

デプロイする Nginx の Docker イメージを作成します。
プロジェクトのルートに以下3つのファイルを用意します。

<!-- html/index.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Document</title>
  </head>
  <body>
    <h1>Hello, Heroku</h1>
  </body>
</html>
## nginx.conf
server {
  listen $PORT;

  location / {
      root /usr/share/nginx/html;
      index index.html;
  }
}
## Dockerfile
FROM nginx

ENV PORT=8080
COPY html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

CMD sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'

Nginx の設定ファイル nginx.conf では listen するポートを動的に指定します。
これはこちらにあるように Heroku 側でポート番号がランダムで割り当てられるようになっているからです。

割り当てられたポート番号は環境変数 $PORT で参照できます。
よって、Dockerfile の CMD 実行時に設定ファイルのポート番号を書き換えるようにしています。

Heroku アプリの作成とデプロイ

ファイルの用意ができたら HerokuCLI を使ってデプロイします。

まず、デプロイ用の構成ファイル heroku.yml をプロジェクトのルートに作成します。

# heroku.yml
build:
  docker:
    web: Dockerfile

次に、Heroku アプリを作成して、スタックを container にセットします。

heroku create your-app-name
heroku stack:set container -a your-app-name

Docker イメージを HerokuContainerRegistry へプッシュします。

heroku container:login
heroku push web -a your-app-name

プッシュが完了したら、release コマンドでデプロイできます。

heroku container:release web -a your-app-name