はじめに
最近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が使われ始めているので,
まだ使っていない人は是非使って見てください!