Dockerを使った軽量なFastAPIの開発環境を構築


はじめに

最近FastAPIを使う機会がよくあり,Dockerでサクッと構築して使い捨てしたかったので
メモとして軽量で構築する方法を残したいと思います.

準備

  • Docker及びDocker Composeが使える環境
バージョン
$ docker --version
Docker version 19.03.8, build afacb8b7f0
  • ファイル構成はこんな感じにします
ファイル構成
.
├── Dockerfile
├── docker-compose.yml
├── main.py
└── requirements.txt

ソース

ここからcloneできます
https://github.com/sattosan/sample-fastapi-alpine

Dockerfile

alpineベースで作っています

Dockerfile
FROM python:3.8-alpine

WORKDIR /app

COPY requirements.txt .
# コンテナ内で必要なパッケージをインストール
RUN apk add --no-cache build-base \
 && pip install --no-cache-dir --trusted-host pypi.python.org -r requirements.txt \
 && apk del build-base

COPY main.py .
EXPOSE 8000
# FastAPIを8000ポートで待機
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]

Docker Compose

docker-compose.yml
version: "3.0"

services:
  # FastAPI
  api:
    container_name: "api"
    build: .
    restart: always
    tty: true
    ports:
      - 8000:8000

必要なパッケージをまとめています

requirements.txt
uvicorn
fastapi

サンプルコード

FastAPIのドキュメントにあるサンプルコードを用意しました

main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}

実行

$ docker-compose up -d --build

Docker Imageサイズの確認

  • alpineベースのImageサイズ
docker images | grep api
latest              bff0158b61ca        29 minutes ago      275MB
  • 本家のImageサイズ

本家様を参考に構築した結果です

$ docker images | grep api
latest              878110f2207f        11 seconds ago      1.02GB

本家に比べて3.6倍軽減出来たことがわかります

動作確認

FastAPIで生成したAPIはSwaggerで自動的にドキュメント化されています

Swaggerで見てみる

ドメイン/docsにアクセスするとドキュメントを見ることが出来ます

API叩いてみる

curlで叩くとこんな感じで返って来ます

結果
$ curl localhost:8000
{"Hello":"World"}

おわりに

今回はalpineベースで軽量な開発環境を構築してみました.

本家より3.6倍軽量になるので,使い捨てには十分な環境だとは思います.
最近ではNetflixを始め様々なプロジェクトでFastAPIが使われ始めているので,
まだ使っていない人は是非使って見てください!

参考サイト