はじめに
Flaskは開発用簡易サーバー機能があって開発時は楽なんですが、運用するとなると Nginx(or Apache) + uWSGI で動作する環境を用意する必要があって面倒です。
Nginx + uWSGI で Flask を動作させるDocker環境が、まさしく uwsgi-nginx-flask-docker という名前で公開されていたので使ってみました。
ディレクトリ構成の違いやタイムゾーンの設定など、サンプルと異なる部分もあるので備忘録として記事に残しておくことにします。
ディレクトリ構成
1つのコンテナで動作するので、プロジェクトルートに Dockerfile と docker-compose.yml を置くことにしました。
.
├── Dockerfile
├── README.md
├── docker-compose.yml
├── myapp/
├── requirements.txt
├── run.py
└── uwsgi.ini
docker-compose.yml
まずは docker-compose.yml から。
プロセスごとにコンテナを用意するという Docker のベストプラクティス的には、Nginx のコンテナと uWSGI のコンテナは分けるべきなのかもしれませんが、uwsgi-nginx-flask-docker は1つのコンテナで両方を動作させます。
version: "2"
services:
web:
build: ./
ports:
- "80:80"
volumes:
- .:/app
environment:
- FLASK_APP=run.py
- 'RUN=flask run --host=0.0.0.0 --port=80'
web と run.py はお好きな名前に変更して構いません。
Dockerfile
次に Dockerfile です。
ベースとなるイメージに Alpine ベースのものを利用し、タイムゾーンを Asia/Tokyo に設定しています。
FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
ENV STATIC_PATH /app/myapp/static
RUN apk --update add tzdata && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
apk del tzdata && \
rm -rf /var/cache/apk/*
COPY ./requirements.txt /app
RUN pip install -r requirements.txt
RUN の最初4行はタイムゾーンの変更です。
その後にプロジェクトの requirements.txt に記載されている必要なパッケージをインストールしています。
run.py
先述した通り、ファイル名は好きな名前で構いません。
from myapp import app
if __name__ == '__main__':
# 開発中のみ利用
app.run(host="0.0.0.0", port=8080, debug=True)
「開発中のみ利用」と書いてある部分は、開発中は
python run.py
を実行して、デバッグ有効の開発用簡易サーバーを立ち上げて使えるようにするためです。
Docker 環境では利用されません。
自分の場合は myapp/__init__.py に以下のように記述しています。
from flask import Flask
app = Flask(__name__)
app.config.from_object('myapp.config')
# (以下略)
まとめ
uwsgi-nginx-flask-docker を使うことで、本家のサンプルそのままではないものの、かなり楽に Flask の Nginx + uWSGI 環境を Docker で構築することができました。
こうしてメモしておけば次はもっと楽できます。
これを見た人にも参考になれば幸いです。