Posted at

Pipenvで管理しているFlaskアプリをDockerコンテナ上で動かす

僕は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__.pycreate_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にアクセスすれば繋がるはず.