Posted at

Dockerを使って低コストでFlaskの開発環境を構築

More than 3 years have passed since last update.


はじめに

ハンズオンや思いつきの用途で、環境をサクッと作って使い捨てたかったので

数ファイルと数秒で構築できるように作りました。


準備


  • Dockerが動く環境

  • インターネット接続

基礎的なことしかやらないので、Dockerさえ動けばなんとかなるはず。

私の実行環境はDocker for MacのPublic Betaです。


バージョン

$ docker --version

Docker version 1.12.0, build 8eab29e, experimental


ソース


ローカルディレクトリ構成

flask/

├ Dockerfile
├ requirements.txt
└ hello.py


Dockerfile

# ベースイメージの指定

FROM python:3.5.2-alpine

# ソースを置くディレクトリを変数として格納
ARG project_dir=/web/hello/

# 必要なファイルをローカルからコンテナにコピー
ADD requirements.txt $project_dir
ADD hello.py $project_dir

# requirements.txtに記載されたパッケージをインストール
WORKDIR $project_dir
RUN pip install -r requirements.txt

# (コンテナ内で作業する場合)必要なパッケージをインストール
RUN apk update
RUN apk add zsh vim tmux git tig


requirements.txt

$ pip install flaskの実行後に$ pip freeze > requirements.txtしたもの


requirements.txt

click==6.6

Flask==0.11.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
Werkzeug==0.11.10

パッケージのバージョンが変わっても困らないのであれば

単純にコンテナ内で$ pip install flaskでもまったく問題なし。


hello.py

公式ページから拝借。

app.runの引数は開発用途として修正。


hello.py

from flask import Flask                           

app = Flask(__name__)

@app.route('/')
def hello_world():
return "Hello World!"

if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)



手順


イメージ作成


イメージ作成

$ cd /path/to/flask/

$ docker build -t flask .


  • '-t flask': 作成するイメージの名前を'flask'にする

  • '.': カレントディレクトリにあるDockerfileを使用


コンテナ起動


コンテナ起動

$ docker run -p 5000:5000 -it flask /bin/sh



  • '-p 5000:5000': hostの5000番ポートをコンテナの5000番ポートに向ける

  • '-it': 現在の入力デバイスでコンテナを操作

  • 'flask': イメージ名の指定

  • '/bin/sh': 起動したコンテナでshコマンドを実行


Flask実行

hostやportはhello.py内で既に指定されているため、実行のみ。


Flask実行

$ cd /path/to/hello/

$ python hello.py

ブラウザからlocalhost:5000にアクセスすると、Hello World!が表示されます。


むすび

今まではAnsibleでpyenvやvirtualenvを駆使して作ってたけど

どうせ捨てるし、バージョン管理周りはざっくりでいいと思う。

Pythonのインストールはベースイメージにおまかせなので

ちゃんとした開発をするならDockerfile読み解くなり自分で作るなりする。