概要
Flask を distroless 上で動かしてみました
ビルドは 3.12 ですが distroless の python は 3.11.2 なのでそこのバージョンは合わせたほうがいいかもしれません
環境
- macOS 15.3.1
- Python 3.12.9
- distroless (gcr.io/distroless/python3) 3.11.2
- docker 27.5.1
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Distroless with Pipenv!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
Pipfile 作成
- pipenv install flask
Dockerfile
# ビルド用のステージ
FROM python:3.12.9-slim-bookworm AS builder
WORKDIR /app
# Pipenv をインストール
RUN pip install --no-cache-dir pipenv
# Pipfile と Pipfile.lock をコピーしてインストール
COPY Pipfile Pipfile.lock ./
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy --ignore-pipfile
# Flask アプリをコピー
COPY app.py .
# Distroless を使用する実行環境
FROM gcr.io/distroless/python3
WORKDIR /app
# Pipenv でインストールした仮想環境のライブラリをコピー
COPY --from=builder /app/.venv /app/.venv
COPY --from=builder /app /app
# 環境変数を設定して Python が `.venv` を認識できるようにする
ENV PYTHONUNBUFFERED=1 \
PIPENV_VENV_IN_PROJECT=1 \
PYTHONPATH="/app/.venv/lib/python3.12/site-packages"
# Flask アプリを起動
CMD ["app.py"]
ビルド
-
docker build -t flask-distroless-pipenv .
起動
-
docker run --rm -p 8080:8080 flask-distroless-pipenv
動作確認
- curl localhost:8080
Hello, Distroless with Pipenv!
- docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-distroless-pipenv latest 9adef9f7e0d0 4 minutes ago 86.2MB
最後に
ビルドしたイメージは軽くなりますがシェルがないのでトラシュは大変そうです
そもそもビルド時には distroless なイメージは使えないのでビルド時のイメージを管理しなければいけないので結局ディストリビューションは必要かもしれません
また distroless で提供している Python のバージョンが 3.11.2 とかなり古いのでそこも微妙な感じはします
0 件のコメント:
コメントを投稿