はじめに
AWSのECSの動作確認用に任意のポート番号のコンテナが必要となり、PythonのFastAPIを使ってDockerコンテナを構築してみました。実務では、コンテナイメージをECRにpushして使用しました。
当時、@kikutch と作業した際の内容を改良しました。
準備
作業ディレクトリを作成
mkdir fastapi_app
cd fastapi_app
ファイルの配置
.
└── fastapi_app
├── Dockerfile
└── main.py
ファイル作成
Dockerfile
# ベースイメージとしてPython 3.11の軽量バージョンを使用
FROM python:3.11.3-slim-buster
# 作業ディレクトリを指定
WORKDIR /usr/src/app
# FastAPIとUvicornのインストール
# キャッシュを利用するため、依存関係インストールを先に実行
RUN pip install --no-cache-dir fastapi uvicorn[standard]
# 必要なPythonプログラムをコンテナにコピー
COPY ./main.py ./main.py
# ビルド時にポート番号を指定できるようにARGを定義し、デフォルトを8000に設定
ARG PORT=8000
# EXPOSEで指定したポートもARGの値に従う
EXPOSE ${PORT}
# アプリケーションをUvicornで実行し、CMDで指定したポートに従う
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "${PORT}"]
main.py
from fastapi import FastAPI
from fastapi.responses import JSONResponse
# FastAPIアプリケーションのインスタンスを作成
app = FastAPI()
# ルートエンドポイント "/" に対する非同期処理を定義
@app.get("/", response_class=JSONResponse)
async def greeting():
"""
シンプルなJSONレスポンスを返す関数。
`response_class=JSONResponse`を指定してパフォーマンス向上。
"""
# JSON形式のレスポンスを返す
return {"greeting": "Hello"}
コンテナ起動
--build-arg PORT=8080
で、任意のポート番号に変更できます。
コンテナ
# Dockerイメージをビルドし、タグ名を "fastapi_app" に設定
# --build-arg PORT=8080 でビルド時に使用するポート番号を指定
docker build -t fastapi_app --build-arg PORT=8080 .
# Dockerコンテナをバックグラウンドで起動
# -p 8080:8080 でホストの8080番ポートをコンテナの8080番ポートにマッピング
# fastapi_app イメージからコンテナを作成して起動
docker run -d -p 8080:8080 fastapi_app
動作確認
curl http://localhost:8080
# MacOSの場合
open http://localhost:8080
FastAPIのAPIドキュメントの確認
FastAPI
# MacOSの場合
open http://localhost:8080/docs
# それ以外は下記のURLをブラウザ表示する
http://localhost:8080/docs
クリーンアップ
コンテナ
# 1. fastapi_app のコンテナを停止
# fastapi_appイメージを使用しているすべてのコンテナを停止
docker ps -q --filter ancestor=fastapi_app | xargs -r docker stop
# 2. fastapi_app のコンテナを削除
# 停止した fastapi_appイメージを使用しているコンテナを削除
docker ps -a -q --filter ancestor=fastapi_app | xargs -r docker rm
# 3. fastapi_app イメージを削除
# fastapi_app のイメージ自体を削除
docker rmi fastapi_app
作業ディレクトリを削除
cd ..
rm -rf fastapi_app