僕はPipenvを愛用しているのですが,あんまりPipenvを使っている記事を見ないので普及のための記事です.今回は,「FlaskアプリをDockerコンテナ上で動かす」というありふれたというか今更?な題材を扱おうと思います.
ディレクトリ構成は以下を想定.以後, project_name/
にいるものとします.
project_name/
Dockerfile
uwsgi.ini
app/
__init__.py
app.py
例のごとく,アプリケーションサーバとして, uwsgi
を使います.設定は例えば以下.
./uwsgi.ini
[uwsgi]
wsgi-file = app/app.py
callable = app
processess = 1
# for development
http = 0.0.0.0:5000
py-autoreload = 1
./app/app.py
にはFlaskインスタンスを置いてください.僕は, ./app/__init__.py
に create_app
関数を定義して, ./app/app.py
で呼んでます.Factory patternと言うんですかね?テスト時とかに便利らしい.
さて, ./Dockerfile
は以下のようにします.
./Dockerfile
FROM python:3.6.5-slim-stretch
RUN apt-get update && apt-get install -y build-essential
RUN pip install pipenv
ENV PIPENV_VENV_IN_PROJECT=1
WORKDIR /usr/local/app
COPY ./Pipfile .
COPY ./Pipfile.lock .
RUN pipenv install
ENV FLASK_ENV=production
COPY ./uwsgi.ini .
CMD ["pipenv", "run", "uwsgi", "uwsgi.ini"]
build-essential
ってなんなのかよくわからなかったのですが, gcc
とかいろんなソフトウェアのインストールに必要なものの詰め合わせんなんですね.余談.
あとは, ./
でbuildしてrun.これだけで終わりです.
docker build -t myflaskapp .
docker run myflaskapp --rm -p 5000:5000
http://localhost:5000
にアクセスすれば繋がるはず.