2025年3月9日日曜日

Flask + distroless 超入門

Flask + distroless 超入門

概要

Flask を distroless 上で動かしてみました
ビルドは 3.12 ですが distroless の python は 3.11.2 なのでそこのバージョンは合わせたほうがいいかもしれません

環境

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 件のコメント:

コメントを投稿