202号室の手記

数学やコンピュータの小ネタを中心に書きます.

Flaskで作成されたWebアプリの動作確認ができるDocker Imageを作成した.

GitHub等で拾った, Flaskで作成されたWebアプリを, ローカルのDocker環境で試したい時に使える playgroundが欲しかったので作成しました.
Webアプリを公開するのは良いが, 人様の環境を汚すのが忍びないとき, などにも使えます.

1. ディレクトリ構造

- flask_env
  + Dockerfile
  - volume
    + main.py
    + requirements.txt

main.pyに, flaskを動かすプログラムを記述します.
なお, ポートは5000番で応答するようにします. 別の番号を利用したい場合は, DockerfileのEXPOSEの欄とdocker run の-pオプションの引数をそれぞれ変更します.
requirements.txtには, 必要なライブラリを, 次のように記載します.

Flask==0.12.1
requests==2.13.0
...

2. Dockerfile

FROM python:3.6

ARG project_dir=/volume/
ADD volume $project_dir

#RUN groupadd -r flask && useradd -r -g flask flask

WORKDIR $project_dir
RUN pip install -r requirements.txt

EXPOSE 5000
#USER flask

CMD ["python", "main.py"]
  • FROM… Pythonの公式イメージv3.6をベースイメージとします.
  • ARG… 環境変数project_dirを宣言しています.
  • ADD… ./volume以下を, コンテナ内部の/volumeとしてマウントしています.
  • RUN… flaskグループとflaskユーザを作成しています. 特に指定しない限り, Dockerfile内に記述されたコマンドは, コンテナ内部のrootユーザによって実行されます.
    今回は公開サーバ用途ではなく, ローカルで試しに動かすためのコンテナを作ろうとしているので, 実行ユーザについては気にしていませんが, アプリを公開する場合は, コメントアウトしてflaskユーザで実行するようにします.
  • WORKDIR… 作業ディレクトリを, 先ほど宣言したproject_dir=/volumeに変更します.
  • RUN… requirements.txtに記述されたライブラリをまとめてインストールします.
  • EXPOSE… 5000番ポートを解放します.
  • USER… 上記と同様に, 公開サーバ上で動かす場合は, 実行ユーザをflaskに変更します.
  • CMD… コンテナ起動時に実行するコマンドとして, python main.pyを指定します.

3. Docker Hubにリポジトリを作成

Docker Hubの自動ビルドサービスを利用して, 上記のイメージを管理するリポジトリを作成します.
Githubと連携することで, 上記のDockerfileから自動でイメージをビルドすることができます.

まず, flask_envディレクトリをGithubまたはBitbucketリポジトリに登録します.

次に, Docker Hubのページ右上の"Create"を選択し, プルダウンから"Create Automated Build"を選択します. f:id:paperlefthand:20170601000330p:plain

GithubまたはBitbucketを選択する画面が出るので, 先ほど選択した方を選びます. f:id:paperlefthand:20170601000546p:plain

選択すると, 自分のリポジトリ一覧が表示されるので, “flask_env"リポジトリを選択します.f:id:paperlefthand:20170601001131p:plain

コメントを書きたければ書きます. なお, デフォルトはpublicリポジトリとなっていますが,1リポジトリのみなら無料でprivateリポジトリに設定できます. f:id:paperlefthand:20170601000847p:plain

4. 自動ビルド

以上で準備が整いました. ターミナルから次のようにコミットすると, 自動ビルドが始まります.

$ git add .
$ git commit -m "link to Docker Hub"
$ git push -u origin master

f:id:paperlefthand:20170601001919p:plain

数分待ってページ更新すると, 次のようにビルド完了の表示に切り替わります.

f:id:paperlefthand:20170601002101p:plain

以上で, Docker Hubにイメージが登録されました.
今後も, gitでpushするたびに, Docker Hubで自動ビルドが実行され, 常に最新の状態に保たれます.

5. コンテナの起動

./volume/main.pyに動かしたいflaskアプリケーションのプログラムを記述して, ターミナルで次のように入力します.

$ docker run -it -p 5000:5000 --name flask_container XXX/flask_env

XXXには, Docker Hubのアカウント名を入れます.

ブラウザからhttp://localhost:5000にアクセスすると, ローカルでflaskアプリケーションが動作していることが確認できます.