rukurxの日記

自分の日々の作業や調べたことのメモ

DockerでローカルにFlask環境を構築する

以下作成するファイル一覧。

$ tree
.
├── Dockerfile
├── app.py
├── docker-compose.yml
└── requirements.txt

まずDockerを使う前にローカルでFlaskの環境を構築する。

Flaskをインストールするため requirements.txt を作成する。

$ cat requirements.txt
Flask==2.1.2

Flaskをインストールする。

$ pip install --no-cache-dir -r requirements.txt

次にアプリケーション app.py を作成する。

from flask import Flask

app = Flask(__name__)

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

Flaskを起動する。

$ flask run
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

http://127.0.0.1:5000 を開いて確認する。

ここまでがFlaskのアプリケーションの準備。

Dockerの環境を用意する。

まずは Dockerfile を作成する。

FROM python:3.10.7-slim-bullseye

WORKDIR /usr/src/app

ENV FLASK_APP=app.py
ENV FLASK_ENV=development

COPY requirements.txt ./

RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

Dockerのイメージは DOCKER OFFICIAL IMAGE から出ている slim-bullseye を使う。 Alpineの方が一般的だが、Pythonのイメージとして使う場合、ビルドが遅かったりイメージが肥大化するので非推奨とのこと。

pythonspeed.com

次に docker-compose.yml を作成する。

version: "3"
services:
  app:
    build: .
    ports:
      - "5001:5001"
    container_name: flask
    volumes:
      - ./:/usr/src/app
    command: flask run --host=0.0.0.0 --port=5001

Dockerを起動する。

$ docker-compose up

http://127.0.0.1:5001/ を開いて確認する。

Dockerfile 使わずに docker-compose.yml だけを使う場合。

version: "3"
services:
  app:
    image: python:3.10.7-slim-bullseye
    container_name: "flask"
    environment:
      - FLASK_APP=app.py
      - FLASK_ENV=development
    working_dir: /usr/src/app
    build: .
    ports:
      - "5001:5001"
    container_name: flask
    volumes:
      - ./:/usr/src/app
    command: >
      sh -c '
        pip install --upgrade pip &&
        pip install --no-cache-dir -r requirements.txt &&
        flask run --host=0.0.0.0 --port=5001
      '