最小限のDocker×FastAPIの環境構築
2023-04-07
PythonでAPIサーバを立てるときに選択肢として、DjangoやFlaskが有名ですが、FastAPIというフレームワークがあるのをご存じでしょうか?
私はそんなにPythonでAPIサーバを書くことはないので、今日まで知らなかったのですが、どうやらモダンなフレームワーク臭を感じ取ったので、さっそく触ってみました。
軽く触ってみて、環境を作って動かすところまで成功したので、備忘録も兼ねて記事にしてみたいと思います。
今回はDockerを利用してFastAPIの環境を作ってみました。
エディタはVSCodeを利用しているのでRemote Containerの設定もしておきます。
ディレクトリ構成
ディレクトリ構成はこんな感じです。
.
├── .devcontainer
│ └── devcontainer.json
├── app
│ └── main.py
├── Dockerfile
├── docker-compose.yml
└── requirements.txt
Dockerの設定
Dockerfileは次のようにしました。 pythonは現時点で最新バージョンのコンテナを利用し、8000番ポートを解放しておきます。
FROM tiangolo/uvicorn-gunicorn:python3.11
LABEL maintainer="Sebastian Ramirez <tiangolo@gmail.com>"
COPY requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
EXPOSE 8000
COPY ./app /app
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.ymlは次のように記述しました。 volumesをappにつないで、コンテナを起動してファイルを編集した際に、変更が反映されるようにしました。 またコンテナのポートをローカルのポートとマッピングして、localhost:8000にアクセスした際に、APIにつながるようにしています。
version: "3.0"
services:
api:
container_name: "api"
build: .
restart: always
tty: true
volumes:
- ./app:/app
ports:
- 8000:8000
Pythonのコード
pythonのコードは次の通りです。 今回は環境が構築できているかを確認するだけなので、ルートにアクセスした際に、HelloWorldが表示されるコードのみです。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
Dockerfileでrequirement.txtからpip installするようになっているので、requirement.txtを書いています。
uvicorn
fastapi
requirement.txtは書き換えたら、pip installを実行しないといけないので、次のコマンドを実行しておきます。
docker-compose up -d --build
VSCodeの設定
VSCodeを利用して開発を行うので、そのための設定を行います。 workspaceFolderに/appを使用するので、設定しておきます。 また拡張機能を利用するために、extensionsも設定しておきます。 copilotとpythonの拡張機能を設定しておきました。
{
"name": "Existing Docker Compose (Extend)",
"dockerComposeFile": [
"../docker-compose.yml",
"docker-compose.yml"
],
"service": "api",
"workspaceFolder": "/app",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"GitHub.copilot"
]
}
}
}
以上が最低限の設定になります。 間違っていたり、追加したいことがあったら追記していこうと思います。
タグ
そらえふ
ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。
お問い合わせはXのDMでお願いします。