🚮

まだuvicorn-gunicorn-dockerイメージ使ってるの?

2024/10/15に公開

uvicorn-gunicorn-dockerからカスタムUvicorn Dockerイメージへの移行

uvicorn-gunicorn-dockerイメージは非推奨となりました。
https://github.com/tiangolo/uvicorn-gunicorn-docker?tab=readme-ov-file#deprecated-tags

なぜなら、Uvicornを--workersオプションと共に直接使用することが可能になり、ほとんどのデプロイメントにおいてこのイメージが不要になったからです。特にKubernetesなどのシステムを使用する場合は、独自のDockerイメージをゼロから作成することを推奨します。このアプローチにより、クラスター レベルでのレプリケーションの管理が容易になり、コンテナ内でGunicornをプロセスマネージャーとして使用する複雑さを回避できます。

はじめに

uvicorn-gunicorn-dockerイメージは、UvicornとGunicornを使用した高性能なPythonウェブアプリケーションのデプロイを簡素化するために設計されました。しかし、Uvicornの進歩により、このイメージは非推奨となりました。本記事では、アプリケーションのニーズに合わせたカスタムDockerイメージの作成手順を説明します。

なぜ移行するのか?

  • Kubernetesおよびクラスター管理: Kubernetesのような最新のオーケストレーションツールは、クラスターレベルでのレプリケーションをより適切に管理できます。
  • 設定の簡素化: Gunicornをプロセスマネージャーとして使用することで発生する複雑さを減らし、直接Uvicornを使用します。
  • パフォーマンスとリソースの最適化: 特定の環境やワークロードに最適化されたカスタムイメージを作成できます。

カスタムUvicorn Dockerイメージの作成

次の手順に従って、Uvicornを使用したPythonアプリケーション用のDockerイメージを作成しましょう。

手順1: Dockerfileを作成

まず、プロジェクトディレクトリにDockerfileを作成します。

FROM python:3.9

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

COPY ./app /code/app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
手順2: Dockerイメージをビルド

Dockerfileを含むディレクトリで次のコマンドを実行します。

docker build -t myimage .
手順3: Dockerコンテナを実行

カスタムイメージを使用してアプリケーションをデプロイします。

docker run -d --name mycontainer -p 80:80 myimage

複数のワーカーの処理

単一のコンテナ内で複数のワーカーが必要な場合、Uvicornはサブプロセスを管理できます。

FROM python:3.9

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

COPY ./app /code/app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--workers", "4"]

結論

非推奨となったuvicorn-gunicorn-dockerイメージからカスタムUvicorn Dockerイメージへの移行は、最新のデプロイメントプラクティスに沿ったものであり、セットアップを簡素化します。このアプローチは、Uvicornの機能を直接活用し、効率的なデプロイメントプロセスを提供します。詳細については、FastAPIのDockerデプロイメントに関するドキュメントを参照してください。

Discussion