はじめに
Restの動作確認をするときにとりあえずテストファイルのjsonデータを返してくれるdockerの上に乗ったFastAPIサーバーを作っています
※testdataのフォルダ以下にtest.json があれば http://***/testdata/test
にリクエストすればtest.jsonのデータが返ってくるような仕組み
環境
Windows10 + WSL(Ubuntu 20.04.3 LTS)
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
・・・
docker 20.10.10
$ docker -v
Docker version 20.10.10, build b485636
フォルダ構成
fastapi
├ Dockerfile
└ app
├ main.py
└ testdata
├ temp.json
└ ...
※確認時は/home/user名
にdockerフォルダを作ってその中にfastapiを展開
変更
テストサーバーなので、接続フリーな設定を追加しました
ファイル
書くのが面倒な方は、こちら からダウンロード
Dockerfile
# 3.6以降なら大丈夫みたい
FROM python:3.9-slim-buster
# pipのupgrade (Warning出るけど、お気になさらずに...)
RUN pip install -U pip
# fastapiとuvicornのインストール
RUN pip install fastapi uvicorn
# ポートはデフォルトの8000で利用
EXPOSE 8000
# デフォルトのディレクトリ設定
WORKDIR /app
# サーバー起動
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import json
import uvicorn
import os
app = FastAPI()
# テストサーバーなので、アクセスオールフリー
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
jsonExtention = ".json"
@app.api_route("/{path:path}", methods=["GET", "POST"])
async def catch_all(path: str):
# カレントまでの絶対パス取得
absPath = os.path.abspath(".")
jsonFilePath = f"{absPath}{os.sep}{path}"
# jsonの拡張子付きではない時
if os.path.splitext(jsonFilePath)[1] != jsonExtention:
jsonFilePath = f"{jsonFilePath}{jsonExtention}"
# ファイルが存在するか
if os.path.exists(jsonFilePath):
jsn = None
with open(jsonFilePath, "r", encoding="utf-8") as f:
jsn = json.load(f)
return jsn
# ファイルがない時
return {"message": "error"}
temp.json
{ "test": "テスト" }
※こちらはファイル名や内容についてはお好みで
コンテナ構築シェル
# dockerファイルのイメージビルド
sudo docker build -t fatestimage .
# コンテナ化(-v appのフォルダ共有、-p 8000ポート使用)
sudo docker run -d --name fatest -v $PWD/app:/app -p 8000:8000 fatestimage
※上記フォルダ構成の fastapi 以下で実行
動作確認
運用アドバイス
\\wsl$
でエクスプローラーからwslにアクセス可能。あとはフォルダとjsonファイルを勝手に作ってアクセス先を増やしたりすればよいかと
最後に
なにも設定してないEdgeが、確認画面をペーストするときに便利なことに気づきました