当サイトは、アフィリエイト広告を利用しています

【Python】FastAPIをVScodeでコンテナ開発する

作成日:2023月08月23日
更新日:2023年12月21日

PythonnのフレームワークのFastAPIをVScodeの拡張機能「DevContainers」を使って
コンテナでリモート開発する方法をまとめておく。
Windows10環境で実施してみた

前提条件

前提条件として下記のような環境であること

  • VSCodeをインストールしていること
  • Docker Desktop for Windowsをインストールしていること

VScodeに拡張機能「DevContainers」をインストールする

下記のようにVScodeの拡張機能で「DevContainers」を探して

2023-08-23-00-42-10 インストールする。

または「DevContainers」が含まれている下記の
「Remote Development」をインストールする

2023-08-23-00-41-19

インストールが完了して再度、vscodeを読み込み 下記の二つが表示されるようになればOK!

2023-08-23-11-34-48

devcontainerの詳しい使い方については下記記事で
まとめています

FastAPIのプロジェクトを作る

FastAPIのプロジェクトを下記の構成で作成する

bash
.
|-- .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
  • .devcontainer:コンテナ関係のファイルを配置
  • .vscode:vscodeの設定関連ファイルを配置
  • api:アプリケーションファイルを配置
  • docker:docker関連ファイルを配置
  • scripts:起動スクリプトを配置

コンテナ関連ファイル

vscodeから起動するコンテナの設定ファイル

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"
}

PythonのLinter関連の設定も行う。

VScodeの関連ファイル

FastAPIをコンテナ実行でデバックするためのlaunch.jsonファイル

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でコンテナを作成するためのファイル類

DockerFile

Dockerイメージを作るためのファイル。

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

requirements.txtを読み込んで必要なパッケージをイメージに入れる

requirements.txt

プロジェクトに必要なパッケージとバージョンを管理するファイル

requirements.txt
fastapi==0.78.0
uvicorn==0.18.1
flake8==4.0.1
black==22.3.0

今回はDockerFileで読み込んで使用する

docker-compose.yml

dockerコンテナを作成するファイル

docker-compose.yml
version: "3.0"
services:
api:
container_name: "api"
volumes:
- ./app:/workspace/app:cached
- ./scripts:/workspace/scripts:cached
- ./.vscode:/workspace/.vscode:cached
build:
context: ./docker/api
dockerfile: Dockerfile
working_dir: /workspace/scripts
command: bash -c "./run.sh"
ports:
- 8080:8080

docker-compose.ymlの「volumes:」にはリモートコンテナとローカルで
同期させてたいものを設定する。

コンテナ開発中、基本的に同期できていないものはコンテナの中にしかないことになるので
コンテナを削除したり、rebuildしたりしたら、消えるので注意!!

アプリケーション関連ファイル

FastAPIで実行するアプリケーションファイルを作成する

main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
def read_root():
return {"Hello": "World"}

REST APIにするためGETメソッドを一つ用意しておく

スクリプトファイル

起動スクリプトを用意する

run.sh
#!/bin/bash
cd /workspace/app && uvicorn main:app --reload --port=8080 --host=0.0.0.0

VScodeでコンテナ開発を行う

プロジェクトの準備ができたので実際にVScodeからdockerでコンテナを作って
開発してみる。 ※docker自体は起動させておく。

dockerの確認

コマンドで現在の起動しているコンテナを確認する

GitBash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

起動している状態のコンテナがない場合は上記のような状態になる。
※別で起動しているコンテナがある場合は表示されるが、今回、VScode作るコンテナが
なければok!

devcontainerを起動する

コマンドパレット(F1 または ctrl + shift + P)を押して
「開発コンテナで再度開くを選択(Dev container:Reopen in Container)」
を実行する

コンテナ開発の起動に成功すると下記のような画面になる

2023-08-23-02-08-17

リモートエクスプローラーの表示でチェックがついていれば、コンテナができている。

dockerで確認してみる

docker確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5a7ec11e983 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

2023-08-23-02-16-36

JSONが帰ってくればOK

まとめ

VScodeのリモート開発機能を使ってPythonのFastAPI開発環境を作ってみた。
リモート開発機能はローカルの環境を汚さずに、かつ、環境構築もすぐ終わるので
今後、積極的に使っていきたい。

別パターン

もしコンテナ開発で

  • Gitを入れたい
  • プロジェクトごと同期させたい

場合は下記のファイルを編集する

Dockerfile

Dockerfileを編集する

Dockerfile
# pythonイメージを取得
FROM python:3.10.6
# pipのインストールとアップデート
RUN python -m pip install --upgrade pip
WORKDIR /workspace/fastAPI_vscode_container/docker/api
COPY requirements.txt .
RUN pip install -U pip \
&& pip install --no-cache-dir --upgrade -r requirements.txt
  • python:3.10.6のイメージを使う
  • workspace配下にプロジェクトを入れる

docker-compose.yml

docker-compose.ymlを編集する

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:cached
build:
context: ./docker/api
dockerfile: Dockerfile
working_dir: /workspace/fastAPI_vscode_container/scripts
command: bash -c "./run.sh"
ports:
- 8080:8080
  • プロジェクトごとバインドする
  • run.shのパスをプロジェクト配下のものに変更する

run.sh

run.sh
#!/bin/bash
cd /workspace/fastAPI_vscode_container/app && uvicorn main:app --reload --port=8080 --host=0.0.0.0
  • プロジェクト配下のrun.shが動くように修正

参考

新着記事

タグ別一覧
top