概ね公式ドキュメント通りでOK
https://fastapi.tiangolo.com/ja/deployment/docker/
プロジェクト構成
以降はVisual Studio Codeを前提として話を進める。
ProjectDirectory ├─ .vscode │ ├─ launch.json ├─ app │ ├─ main.py ├─ debug-docker-compose.yml ├─ docker-compose.yml ├─ Dockerfile ├─ requirements.txt
少し重くなるため、開発用と+デバッグ実行用途で分けている。
app/main.py
from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): test = 1 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}app以下のファイルはコンテナにマウントされる(後ほど設定する)
Dockerfile
FROM python:3.13-rc-slim as builder # FROM python:3 # Python FastAPI用Dockerfile # 以下はdocker-composeで設定 ## コンテナとホスト間でポートのマッピング ## ホストの./appディレクトリをコンテナ上の/code/appへマウント WORKDIR /code RUN apt-get update # ロケール設定、タイムゾーン変更 RUN apt-get -y install locales && \ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LC_ALL ja_JP.UTF-8 ENV TZ JST-9 # コンテナ内での編集用 RUN apt-get install -y vim less # 依存関係インストール COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # RUN pip install fastapi # RUN pip install pydantic # RUN pip install "uvicorn[standard]" # COPY ./app /code/app
元となるイメージは以下から対応しているバージョンの一番新しいものを選択する。
https://hub.docker.com/_/python
slimだとサイズが小さくなる(必要なものが含まれていない可能性もある)
app以下のソースファイルは後ほどマウントするため公式の手順と違ってコピーしない。
また起動コマンドはdocker-composeで記述するためDockerfileには記述しない。
requirements.txt
依存関係を記述してビルド時にインストールするように。
fastapi>=0.68.0,<0.69.0 pydantic>=1.8.0,<2.0.0 uvicorn>=0.15.0,<0.16.0 debugpy
docker-compose.yml
version: '3' services: python3: ports: - 80:80 restart: always build: context: . target: dev container_name: 'python3' # tty: true volumes: - ./app:/code/app command: [ "uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0", "--port", "80" ]
以上で起動して確認可能。
docker-compose up
docker-compose -f docker-compose.yml up -d
docker-compose -f docker-compose.yml up -d --build
-f ファイル名:設定ファイルを指定。デフォルトはdocker-compose.ymldocker-compose -f docker-compose.yml up -d
docker-compose -f docker-compose.yml up -d --build
-d:バックグラウンドで起動する
--build:再ビルドをおこなう。Dockerfileを変更したときなど。
docker-compose upコマンド実行後に以下のいずれかへアクセス(どれもおおよそ同じ意味)
http://localhost/
http://0.0.0.0/
http://127.0.0.1
また
http://127.0.0.1/docs
で作成したAPIのドキュメント確認すことが可能(FastAPIの機能)
デバッグをおこなう
debug-docker-compose.yml
version: '3' services: python3: ports: - 80:80 - "5678:5678" restart: always build: . container_name: 'python3' # tty: true volumes: - ./app:/code/app command: [ "python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "-m", "uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0", "--port", "80" ]
通常のdocker-composeファイルとの違いはportと起動コマンドのみ。
launch.json
Visual Studio CodeのRUN AND DEBUGから
create a launch.json
→ Python Debugger
→ Remote Attach
→ localhost
→ 5678
以下のファイルが作成される。
{ "version": "0.2.0", "configurations": [ { "name": "Python Debugger: Remote Attach", "type": "debugpy", "request": "attach", "connect": { "host": "localhost", "port": 5678 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "." } ] } ] }
ブレークポイントを貼った状態でF5でデバッグ実行をおこなうと、該当の処理を実行するときに一時停止して変数等を確認できるようになる。
参考
https://fastapi.tiangolo.com/ja/deployment/docker/
https://qiita.com/yagrush/items/e46ab11b22495cd2c0a0