🎃
VSCode+DockerでFastAPIの開発環境を作るまで
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
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"
}
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
マーケットプレイスからインストールする拡張機能を記載。
アプリケーション
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
起動
- 「Remote - Containers」をインストールする。
- 左下から起動アイコンをクリックする。
- Reopen in Containerを選択する。
- 起動処理が行われるので、終わるのを待つ。
- http://localhost:8080/docs にアクセスできたら完了。
起動アイコン
停止
- 左パネルのRemote Explorerを選択する。
- workspaceを右クリックする。
- Stop Containerを選択する。
- 停止後にどうするか警告されるので、Reopen Folder locallyを選択してローカルに戻る。
Remote Explorer
停止前の警告
Discussion