DockerでFastAPI+別コンテナのMySQLの環境を構築してみる(Windows)

開発環境

  • OS:Windows11
  • Docker Desktopインストール済み
  • VSCodeインストール済み

MySQLは下記の記事で構築した別プロジェクトのコンテナ上で動いているものになります。

アプリケーションの定義ファイル(YAML)を作成

type nul > docker-compose.yml

エラーメッセージが表示されますが、YAMLファイルが作成されていれば問題ありません。
下記の内容でYAMLファイルを編集。

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    networks:
      - mysql_default

networks:
  mysql_default:
    external: true

Dockerファイルを作成

type nul > Dockerfile

エラーメッセージが表示されますが、Dockerファイルが作成されていれば問題ありません。
下記の内容でDockerファイルを編集。

# ベースイメージを指定
FROM python:3.9

# 作業ディレクトリを作成
WORKDIR /app

# 必要なパッケージをインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのソースコードをコピー
COPY . .

# アプリケーションを起動
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]

requirements.txtを作成

type nul > requirements.txt

エラーメッセージが表示されますが、requirements.txtが作成されていれば問題ありません。
下記の内容でrequirements.txtを編集。

uvicorn
fastapi
mysqlclient
sqlalchemy

appディレクトリを作成

mkdir app

db.pyを作成

type nul > app/db.py

MySQL接続用のコードを作成。
hostは別プロジェクトのMySQLコンテナ名です。
db_name、user、passwordは環境に合わせてください。

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session

host = "db:3306"
db_name = "odaneko"
user = "odaneko"
password = "odaneko"

DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % (
    user,
    password,
    host,
    db_name,
)

ENGINE = create_engine(
    DATABASE,
    echo=True
)

session = scoped_session(
    sessionmaker(
        autocommit=False,
        autoflush=False,
        bind=ENGINE
    )
)

Base = declarative_base()
Base.query = session.query_property()

main.pyを作成

type nul > app/main.py

m_category1というテーブルから全レコード・全カラムを取得する簡単なプログラムを作成。

from fastapi import FastAPI
from db import session
from sqlalchemy import text

app = FastAPI()

@app.get("/mysql-test")
def mysql_test():
    query = text("SELECT * FROM m_category1;")
    records = session.execute(query).fetchall()
    return [dict(record._mapping) for record in records]

コンテナをビルド・立ち上げ

docker compose up -d --build

Dockerの画面でコンテナがRunningになっていることも確認。

環境が構築できたか確認

下記のURLを開いて、レコードが取得できていたらOK。
http://localhost:3000/

以上になります。
お読み頂き、ありがとうございました。