Primary About Development

最小限の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番ポートを解放しておきます。

Dockerfile
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につながるようにしています。

docker-compose.yml
version: "3.0"

services:
  api:
    container_name: "api"
    build: .
    restart: always
    tty: true
    volumes:
      - ./app:/app
    ports:
      - 8000:8000

Pythonのコード

pythonのコードは次の通りです。 今回は環境が構築できているかを確認するだけなので、ルートにアクセスした際に、HelloWorldが表示されるコードのみです。

main.py
from fastapi import FastAPI

app = FastAPI()

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

Dockerfileでrequirement.txtからpip installするようになっているので、requirement.txtを書いています。

requirement.txt
uvicorn
fastapi

requirement.txtは書き換えたら、pip installを実行しないといけないので、次のコマンドを実行しておきます。

docker-compose up -d --build

VSCodeの設定

VSCodeを利用して開発を行うので、そのための設定を行います。 workspaceFolderに/appを使用するので、設定しておきます。 また拡張機能を利用するために、extensionsも設定しておきます。 copilotとpythonの拡張機能を設定しておきました。

devcontainer.json
{
	"name": "Existing Docker Compose (Extend)",

	"dockerComposeFile": [
		"../docker-compose.yml",
		"docker-compose.yml"
	],

	"service": "api",

	"workspaceFolder": "/app",

	"customizations": {
        "vscode": {
            "extensions": [
				"ms-python.python",
				"GitHub.copilot"
            ]
        }
    }
}

以上が最低限の設定になります。 間違っていたり、追加したいことがあったら追記していこうと思います。

プロフィール写真

Soraef

ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。

お問い合わせはTwitterのDMでお願いします。