Posted at

FlaskアプリケーションをHeroku上のDockerで起動

More than 1 year has passed since last update.


はじめに

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

この段階ではソースも何も入っていないのでただの箱です。

アクセスするとこんな感じになります。↓

Heroku___Welcome_to_your_new_app_.png


Dockerコンテナのpush

Dockerfileを元にコンテナをビルドし、リポジトリに送ります。

$ heroku container:push --app flask-clock-sample web



  • --app flask-clock-sample: 指定したアプリケーションにコンテナを展開


  • web: Herokuにおけるプロセスタイプ(webworker)を指定


動作確認

$ heroku open --app flask-clock-sample

時計アプリケーションの動作を確認できました。

Clock.png


まとめ

今回利用したアプリケーションではアドオンを利用していないため

非常にシンプルに設定し、デプロイすることができました。

DB接続やログの整理など、Herokuらしい構成を作るにはもう少し苦労しそうです。