IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python Poetryを使ったDocker Imageの作成

どうも、nippa です。

python のパッケージ管理は requirements.txt から完全に poetry に移行しました。

docker image についても poetry に移行するために、Dockerfile を書いてみたいと思います。

Poetry1.2のアップデート情報はこちらの記事にまとめています。

timesaving.hatenablog.com

環境

  • 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 を簡単に作成できますので、ぜひご活用ください。

ではでは、また次回。