説明
Dockerfile に USER がなければ、ベースイメージのユーザー設定を引き継ぎます。ベースイメージにも指定がなければ既定は root です。USER の省略が常に root を意味するわけではありませんが、最終イメージの実際のユーザーを確認する必要があります。
アカウントを作成するだけでは実行ユーザーは切り替わりません。マルチステージビルドでは、最終ステージのベースイメージとユーザー設定を確認してください。
想定される影響
- 実際のユーザーが root の場合、アプリケーション侵害によってコンテナー内のより広いファイルやプロセスへアクセスされる可能性があります。
- ベースイメージやデプロイ設定の変更で、意図した実行権限が変わる場合があります。
対処方法
- 最終実行ステージに必要な非 root アカウントを用意し、
USER <non-root-user>で明示してください。 - アプリケーションファイルと書き込み先の所有者・権限を実行アカウントの必要な範囲に限定してください。
- イメージ設定と実行時のユーザー上書きを確認し、起動とファイルアクセスをテストしてください。
例
実際の app/app.py と、選択したバージョンに対応するアプリケーションコードが必要です。検証済みの依存関係を管理し、継続して更新してください。
変更前
dockerfile
FROM python:3.13-slim
RUN pip install Flask==3.1.2
RUN useradd -ms /bin/bash appuser
COPY --chown=appuser:appuser app /app
WORKDIR /app
CMD ["python", "app.py"]
このベースイメージの既定ユーザーは root です。appuser の作成やファイル所有権の付与だけでは、実行アカウントは変わりません。
変更後
dockerfile
FROM python:3.13-slim
RUN pip install Flask==3.1.2
RUN useradd -ms /bin/bash appuser
COPY --chown=appuser:appuser app /app
WORKDIR /app
USER appuser
CMD ["python", "app.py"]
USER appuser でアプリケーションの既定ユーザーを指定しています。この例ではファイル所有権も同じアカウントに合わせています。