はじめに
1ヶ月程度前に、Dockerイメージをそのまま
Herokuにデプロイすることができるようになったので試してみました。
まだパブリックベータではありますが。
参考
Container registry public beta - deploy Docker images to Heroku
Container Registry and Runtime
準備
以下は既に済んでいるものとして記述します。
- Dockerのインストール
- Herokuのアカウント登録
- Heroku Toolbeltのインストール
ソース
デプロイ対象には自前のFlaskアプリケーションを利用しました。
https://github.com/nanakenashi/image_clock
時刻に応じて画像を切り替えるシンプルな時計のアプリケーションです。
image_clock/
├ static/
├ templates/
├ Dockerfile
├ app.py
└ requirements.txt
# Pythonが入ったAlpine Linuxをベースイメージに使用
FROM python:3.5.2-alpine
# gitのインストール
RUN apk update
RUN apk add git
# Pythonのパッケージインストール
ADD requirements.txt /tmp
RUN pip install -r /tmp/requirements.txt
# ソースコードを配置
WORKDIR /web
RUN git clone https://github.com/nanakenashi/image_clock.git clock
# flaskアプリケーションの起動
ENV FLASK_APP /web/clock/app.py
CMD flask run -h 0.0.0.0 -p $PORT
ポイントはflaskアプリケーションの起動の部分です。
- 環境変数の設定は
RUN
ではなくENV
で行う - hostは実行環境のIPに合わせるために
0.0.0.0
とする - Heroku環境におけるポート番号は、環境変数
PORT
に格納されている
手順
事前確認
docker
コマンドが利用できることを確認し
$ docker ps
Herokuへのログインを済ませます。
$ heroku login
ソースコードの配置
GitHubからソースコードを取得し、ディレクトリに移動します。
$ git clone https://github.com/nanakenashi/image_clock.git ./image_clock
$ cd image_clock
Herokuアプリケーションの作成
アプリケーションの置き場所を確保します。
$ heroku create flask-clock-sample
この段階ではソースも何も入っていないのでただの箱です。
アクセスするとこんな感じになります。↓
Dockerコンテナのpush
Dockerfileを元にコンテナをビルドし、リポジトリに送ります。
$ heroku container:push --app flask-clock-sample web
-
--app flask-clock-sample
: 指定したアプリケーションにコンテナを展開 -
web
: Herokuにおけるプロセスタイプ(web
かworker
)を指定
動作確認
$ heroku open --app flask-clock-sample
まとめ
今回利用したアプリケーションではアドオンを利用していないため
非常にシンプルに設定し、デプロイすることができました。
DB接続やログの整理など、Herokuらしい構成を作るにはもう少し苦労しそうです。