📑
DockerでFastAPIの環境を作ってGETするまで
FastAPIを触りたかったので、取り敢えずDockerで環境を作る。
公式ドキュメント
Dockerを使用したデプロイ方法は公式にドキュメントが用意されているので、それを参考にする。
プロジェクト構成
sample_project
├── app
│ └── main.py
├── docker-compose.yml
├── Dockerfile
└── requirements.txt
app
公式ドキュメントからコピペ。[1]
main.py
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
docker-compose.yml/Dockerfile/requirements.txt
docker-compose.yml
version: "3.0"
services:
api:
container_name: "api"
volumes:
- ./app: /app
build: .
ports:
- 8080:8080
- buildはDockerfileのあるディレクトリを指定する。今回は同じディレクトリにあるので「build: .」
- volumesでapp配下(今回の場合はmain.py)をマウントする。
- ポートは8080を指定する。
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app/ .
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8080"]
- Pythonは3.9-slimを使用する。
- requirements.txtをコピーして、必要なパッケージをインストールする。
- app配下(今回の場合はmain.py)をコピーして、uvicorn[2]でデプロイする。
- uvicornは--reloadを指定しておくとmain.pyを変更した際に再起動しなくて良い。
requirements.txt
fastapi
uvicorn
- 必要なパッケージを記載しておく。
起動
docker-compose up
以下の3つにアクセス可能。
-
http://localhost:8080/docs
- 対話的APIドキュメント(FastAPIの機能)[3]
-
http://localhost:8080
- Hello World
-
http://localhost:8080/items/5?q=somequery
- リクエストパラメータ・クエリパラメータの受け渡し。
停止
docker-compose down
Discussion