当サイトは、アフィリエイト広告を利用しています
PythonnのフレームワークのFastAPIをVScodeの拡張機能「DevContainers」を使って
コンテナでリモート開発する方法をまとめておく。
Windows10環境で実施してみた
前提条件として下記のような環境であること
下記のようにVScodeの拡張機能で「DevContainers」を探して
または「DevContainers」が含まれている下記の
「Remote Development」をインストールする
インストールが完了して再度、vscodeを読み込み 下記の二つが表示されるようになればOK!
devcontainerの詳しい使い方については下記記事で
まとめています
FastAPIのプロジェクトを下記の構成で作成する
.|-- .devcontainer| `-- devcontainer.json|-- .vscode| `-- launch.json|-- app| |-- __pycache__| | `-- main.cpython-39.pyc| `-- main.py|-- docker| `-- api| |-- Dockerfile| `-- requirements.txt|-- docker-compose.yml`-- scripts`-- run.sh
vscodeから起動するコンテナの設定ファイル
{"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"}
PythonのLinter関連の設定も行う。
FastAPIをコンテナ実行でデバックするためのlaunch.jsonファイル
{"version": "0.2.0","configurations": [{"name": "Python: FastAPI","type": "python","request": "launch","module": "uvicorn","args": ["app.main:app","--reload"],"jinja": true,"justMyCode": true}]}
[app.main]の部分は実際の実行するプロジェクトの構成に合わせる必要がある。
dockerでコンテナを作成するためのファイル類
Dockerイメージを作るためのファイル。
FROM python:3.9-slimWORKDIR /workspaceCOPY requirements.txt .RUN pip install -U pip \&& pip install --no-cache-dir --upgrade -r requirements.txt
requirements.txtを読み込んで必要なパッケージをイメージに入れる
プロジェクトに必要なパッケージとバージョンを管理するファイル
fastapi==0.78.0uvicorn==0.18.1flake8==4.0.1black==22.3.0
今回はDockerFileで読み込んで使用する
dockerコンテナを作成するファイル
version: "3.0"services:api:container_name: "api"volumes:- ./app:/workspace/app:cached- ./scripts:/workspace/scripts:cached- ./.vscode:/workspace/.vscode:cachedbuild:context: ./docker/apidockerfile: Dockerfileworking_dir: /workspace/scriptscommand: bash -c "./run.sh"ports:- 8080:8080
docker-compose.ymlの「volumes:」にはリモートコンテナとローカルで
同期させてたいものを設定する。
コンテナ開発中、基本的に同期できていないものはコンテナの中にしかないことになるので
コンテナを削除したり、rebuildしたりしたら、消えるので注意!!
FastAPIで実行するアプリケーションファイルを作成する
from fastapi import FastAPIapp = FastAPI()@app.get("/hello")def read_root():return {"Hello": "World"}
REST APIにするためGETメソッドを一つ用意しておく
起動スクリプトを用意する
#!/bin/bashcd /workspace/app && uvicorn main:app --reload --port=8080 --host=0.0.0.0
プロジェクトの準備ができたので実際にVScodeからdockerでコンテナを作って
開発してみる。
※docker自体は起動させておく。
コマンドで現在の起動しているコンテナを確認する
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
起動している状態のコンテナがない場合は上記のような状態になる。
※別で起動しているコンテナがある場合は表示されるが、今回、VScode作るコンテナが
なければok!
コマンドパレット(F1 または ctrl + shift + P)を押して
「開発コンテナで再度開くを選択(Dev container:Reopen in Container)」
を実行する
コンテナ開発の起動に成功すると下記のような画面になる
リモートエクスプローラーの表示でチェックがついていれば、コンテナができている。
dockerで確認してみる
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc5a7ec11e983 fastapi_vscode_container-api "/bin/sh -c 'echo Co…" 9 minutes ago Up 9 minutes 0.0.0.0:8080->8080/tcp api
VScodeから起動したdockerコンテナが起動していることが確認できる。
作成したREST APIにアクセスしてみる
http://localhost:8080/hello
JSONが帰ってくればOK
VScodeのリモート開発機能を使ってPythonのFastAPI開発環境を作ってみた。
リモート開発機能はローカルの環境を汚さずに、かつ、環境構築もすぐ終わるので
今後、積極的に使っていきたい。
もしコンテナ開発で
場合は下記のファイルを編集する
Dockerfileを編集する
# pythonイメージを取得FROM python:3.10.6# pipのインストールとアップデートRUN python -m pip install --upgrade pipWORKDIR /workspace/fastAPI_vscode_container/docker/apiCOPY requirements.txt .RUN pip install -U pip \&& pip install --no-cache-dir --upgrade -r requirements.txt
docker-compose.ymlを編集する
version: "3.0"services:api:container_name: "api"volumes:- ../fastAPI_vscode_container:/workspace/fastAPI_vscode_container:cached# - ./scripts:/workspace/scripts:cached# - ./.vscode:/workspace/.vscode:cachedbuild:context: ./docker/apidockerfile: Dockerfileworking_dir: /workspace/fastAPI_vscode_container/scriptscommand: bash -c "./run.sh"ports:- 8080:8080
#!/bin/bashcd /workspace/fastAPI_vscode_container/app && uvicorn main:app --reload --port=8080 --host=0.0.0.0
当記事では依存関係管理はpipを使って行ったが
poetryというパッケージ管理ツールを使う方法もある。
poetryについてpipとの違いも含めて下記記事でまとめている
またFastApiのREST APIをpipではなくpoetryを使ってVSCodeで開発する方法についても
下記記事でまとめています。