この記事は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