🎃

VSCode+DockerでFastAPIの開発環境を作るまで

2022/06/23に公開

VSCodeの拡張機能「Remote - Containers[1]」を使ってFastAPIのリモート開発をできるようにするまでの手順を記載する。

プロジェクト構成

.
├── .devcontainer
│   └── devcontainer.json
├── app
│   └── main.py
├── docker
│   └── api
│       ├── Dockerfile
│       └── requirements.txt
├── scripts
│   └── run.sh
└── docker-compose.yml
  • app:アプリケーションのファイルを配置。
  • docker:Docker関連のファイルを配置。
  • scripts:起動スクリプトを配置。

Docker関係

docker-compose.yml

docker-compose.yml
version: "3.0"

services:
  api:
    container_name: "api"
    volumes:
      - ./app:/workspace/app:cached
      - ./scripts:/workspace/scripts:cached
    build:
      context: ./docker/api
      dockerfile: Dockerfile
    working_dir: /workspace/scripts
    command: bash -c "./run.sh"
    ports:
      - 8080:8080
  • コンテナのworkspace配下で開発を行うこととする。
  • 起動は/scripts/run.shで行う。

docker/api/Dockerfile

FROM python:3.9-slim

WORKDIR /workspace
COPY requirements.txt .

RUN pip install -U pip \
    && pip install --no-cache-dir --upgrade -r requirements.txt

docker/api/requirements.txt

fastapi==0.78.0
uvicorn==0.18.1
flake8==4.0.1
black==22.3.0
  • LinterはFlake8[2]を使用する。
  • フォーマッターはBlack[3]を使用する。

Remote - Container関係

.devcontainer/devcontainer.json

公式[4]を参考に記載する。

devcontainer.json
{
	"name": "api",
	"dockerComposeFile": [
		"../docker-compose.yml"
	],
	"settings": {
		"python.linting.enabled": true,
		"python.linting.lintOnSave": true,
		// Pylance
		"python.languageServer": "Pylance",
		"python.analysis.completeFunctionParens": true,
		// Linter(flake8)
		"python.linting.flake8Path": "/usr/local/bin/flake8",
		"python.linting.pylintEnabled": false,
		"python.linting.flake8Enabled": true,
		// Formatter(black)
		"python.formatting.blackPath": "/usr/local/bin/black",
		"python.formatting.provider": "black",
		"python.formatting.blackArgs": [
			"--line-length=79"
		],
		"[python]": {
			"editor.formatOnSave": true
		}
	},
	"extensions": [
		"ms-python.python",
		"ms-python.vscode-pylance",
		"njpwerner.autodocstring"
	],
	"service": "api",
	"workspaceFolder": "/workspace"
}

https://github.com/PyCQA/pycodestyle/blob/main/docs/intro.rst#error-codes

settings

拡張機能の設定を行う。

  • Linter全般
key value comment
python.linting.enabled true PythonのLintを有効にする。
python.linting.lintOnSave true ファイル保存時にLintを実行する。
  • Pylance
key value comment
python.languageServer Pylance 言語サーバーの設定。Pylanceを設定する。
python.analysis.completeFunctionParens true functionの入力補完。デフォルトはfalse。
  • Flake8
key value comment
python.linting.flake8Path /usr/local/bin/flake8 flake8のパスを指定
python.linting.pylintEnabled false Pylintを有効にする。flake8を使用するのでfalse。
python.linting.flake8Enabled true Flake8を有効にする。
python.linting.flake8Args 後述 引数の設定
  • Black
key value comment
python.formatting.blackPath /usr/local/bin/black Blackのパスを指定
python.formatting.provider black Pylintを有効にする。flake8を使用するのでfalse。
python.formatting.blackArgs 後述 引数を指定。
editor.formatOnSave true ファイル保存時にフォーマットを実行する。
  • python.formatting.blackArgs
key value comment
line-length 79 フォーマットをかける長さ - Flake8が79を超えると警告を出すため。

extensions

マーケットプレイスからインストールする拡張機能を記載。

  • ms-python.python[5]
  • ms-python.vscode-pylance[6]
  • njpwerner.autodocstring[7]

アプリケーション

app/main.py

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}

スクリプト

scripts/run.sh

run.sh
#!/bin/bash

cd /workspace/app && uvicorn main:app --reload --port=8080 --host=0.0.0.0

起動

  1. 「Remote - Containers」をインストールする。
  2. 左下から起動アイコンをクリックする。
  3. Reopen in Containerを選択する。
  4. 起動処理が行われるので、終わるのを待つ。
  5. http://localhost:8080/docs にアクセスできたら完了。

起動アイコン
起動アイコン

停止

  1. 左パネルのRemote Explorerを選択する。
  2. workspaceを右クリックする。
  3. Stop Containerを選択する。
  4. 停止後にどうするか警告されるので、Reopen Folder locallyを選択してローカルに戻る。

Remote Explorer
Remote Explorer

警告
停止前の警告

脚注
  1. Developing inside a Container - Visual Studio Code ↩︎

  2. Flake8: Your Tool For Style Guide Enforcement ↩︎

  3. Black 22.3.0 documentation ↩︎

  4. vscode-dev-containers/containers/python-3/.devcontainer/devcontainer.json ↩︎

  5. Python ↩︎

  6. Pylance ↩︎

  7. autoDocstring ↩︎

Discussion