【Docker】python + streamlitをmulti-stage buildで構築

プログラミング

この記事はDockerイメージの容量を小さくする方法の一つである、「multi-stage build」の備忘録です。

ホストのpythonパッケージ管理はpoetryを使用しているものとします。

Docker multi-stage build (with poetry)

今回は、streamlitを起動するDockerイメージを作成します。

想定するディレクトリ構造は次の通りです。

.
├─ dockerfile
├─ poetry.lock
├─ poetry.tomi
└─ app/
    └─ main.py
dockerfile
# building stage
FROM python:3.10 as builder

WORKDIR /opt

COPY ./pyproject.toml ./poetry.lock* /opt/

RUN pip install poetry && \
    poetry config virtualenvs.create false && \
    poetry install --no-dev && \
    rm -rf ~/.cache


# production stage
FROM python:3.10-slim

COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY --from=builder /usr/local/bin/streamlit /usr/local/bin/streamlit

COPY ./app /app
WORKDIR /app

EXPOSE 8080

CMD streamlit run main.py \
    --browser.serverAddress="0.0.0.0" \
    --server.port="8080"

Dockerイメージの容量が通常と比べ小さいことが確認できます。

# Dockerイメージ作成
$ docker build . -t streamlit

# 作成したDockerイメージ表示
$ docker images

# 出力
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
streamlit    latest    xxxxxxxxxxxx   x minutes ago   579MB

タイトルとURLをコピーしました