どうも、nippa です。
python のパッケージ管理は requirements.txt から完全に poetry に移行しました。
docker image についても poetry に移行するために、Dockerfile を書いてみたいと思います。
Poetry1.2のアップデート情報はこちらの記事にまとめています。
- 環境
- Python + Poetry の Dockerfile
- pyproject.toml の作成
- app.py の作成
- Dockerfile の作成
- Docker image の作成
- コンテナの起動
- 感想
環境
- macOS 12.6
- docker 20.10
- poetry 1.2
Python + Poetry の Dockerfile
今回題材として簡単な API サーバを Docker + Poetry + fastAPI で立ててみたいと思います。
ディレクトリ構造
今回のディレクトリ構造は以下になっています。
. ├── Dockerfile ├── app.py ├── poetry.lock └── pyproject.toml
pyproject.toml の作成
poetry で新規プロジェクトを作成します。
poetry init
必要なライブラリを追加します。今回は以下のとおりです。
poetry add pydantic fastapi "uvicorn[standerd]"
ライブラリの準備は完了です。
app.py の作成
よくあるhello world
を返すような REST API を実装します。
from pydantic import BaseModel from fastapi import FastAPI app = FastAPI() class HelloWorld(BaseModel): message: str @app.get("/hello-world", response_model=HelloWorld) async def hello_world(): return HelloWorld(message="Hello world")
Dockerfile の作成
Python + Poetry + FastAPI の Dockerfile を作成すると以下のようになります。
他で使いまわす場合は、package install 部分以下を変更すれば、使いませます。
FROM python:3.9-slim AS builder LABEL version="0.1" LABEL description="api server" ENV POETRY_HOME="/opt/poetry" \ POETRY_VIRTUALENVS_CREATE=false \ \ PIP_NO_CACHE_DIR=off \ PIP_DISABLE_PIP_VERSION_CHECK=on \ PIP_DEFAULT_TIMEOUT=100 \ \ PYSETUP_PATH="/opt/pysetup" ENV PATH="$POETRY_HOME/bin:$PATH" RUN apt-get update && \ apt-get install --no-install-recommends -y curl && \ apt-get clean RUN curl -sSL https://install.python-poetry.org/ | python - # packages install RUN mkdir /app WORKDIR /app COPY ./pyproject.toml /app/pyproject.toml RUN poetry install --only main # Python script COPY ./app.py /app/app.py EXPOSE 80 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80"]
Docker image の作成
docker のイメージファイルを作成します。
docker build -t "[イメージ名]" -f Dockerfile .
コンテナの起動
上で作成したイメージをコンテナで動かします。
docker container run -it -d -p 127.0.0.1:8080:80 --name [コンテナ名] [作成したイメージ名]
起動はdocker ps
で確認できます。
API を叩いてみましょう。
ブラウザを開き、http://127.0.0.1:8080/hello-world
にアクセスすると、
{"message":"Hello world"}
が表示されれば、API サーバが正しく起動しています。
感想
今回 Docker + Poetry + FastAPI で API サーバを localhost にて立ててみました。
これで Poetry を使った Docker image を簡単に作成できますので、ぜひご活用ください。
ではでは、また次回。