実行したい(RUN

1RUN コマンド

RUNでコマンドを実行し、コンテナイメージをカスタマイズできます。 RUNコマンドごとに新しいレイヤーが作成されます。

複数のコマンドは&&で連結して1つのRUNにまとめることで、 イメージサイズを削減し、ビルド効率を向上させます。

複数のコマンドをまとめる場合は、\で改行して読みやすく記述できます。

コマンドを連結したい

1RUN apt-get update \
2    && apt-get install -y curl git \
3    && apt-get clean \
4    && rm -rf /var/lib/apt/lists/*

複数のコマンドを&&で連結することで、1つのレイヤーにまとめられます。 各コマンドは\で改行して、読みやすくできます。

パッケージを追加したい(Debian/Ubuntu)

1RUN apt-get update \
2    && apt-get install -y --no-install-recommends \
3    curl \
4    git \
5    && apt-get clean \
6    && rm -rf /var/lib/apt/lists/*

Debian/Ubuntuベースのイメージを使っている場合に、パッケージを追加するコマンドです。

各オプションの説明:

  • apt-get update: パッケージリストを更新

  • -y: すべてのプロンプトに自動で「yes」と答える

  • --no-install-recommends: 推奨パッケージを除外し、最小限のみインストール

  • apt-get clean: キャッシュをクリア

  • rm -rf /var/lib/apt/lists/*: パッケージリストを削除(イメージサイズ削減)

複数のコマンドを1つのRUNでまとめることで、イメージサイズを削減できます。

Python環境を構築したい(python + uv)

 1FROM python:3.12-slim
 2WORKDIR /app
 3
 4COPY pyproject.toml uv.lock ./
 5
 6# 依存関係をインストール
 7RUN pip install --no-cache-dir uv \
 8    && uv sync --frozen
 9
10# 環境変数を設定
11ENV PATH="/app/.venv/bin:$PATH"

uv を使うことで、高速で信頼性の高いPython環境構築ができます。

ポイント:

  • --no-cache-dir: pipのキャッシュを無効化してイメージサイズを削減

  • uv sync --frozen: lockファイルから正確に依存関係をインストール

  • .venvuvが自動的に作成します

Python環境を構築したい(python + poetry)

 1FROM python:3.12-slim
 2WORKDIR /app
 3
 4COPY pyproject.toml poetry.lock ./
 5
 6# poetryをインストール
 7RUN pip install --no-cache-dir poetry \
 8    && poetry config virtualenvs.in-project true \
 9    && poetry install --no-interaction --no-ansi
10
11# 環境変数を設定
12ENV PATH="/app/.venv/bin:$PATH"

Poetry を使うことで、依存関係を厳密に管理できます。

ポイント:

  • --no-cache-dir: pipのキャッシュを無効化してイメージサイズを削減

  • virtualenvs.in-project true: 仮想環境をプロジェクト内に作成(.venv

  • --no-interaction --no-ansi: 対話的な入力を無効化し、ANSIカラーを無効化

  • poetry.lock: Poetryのlockファイルから正確に依存関係をインストール

Python環境を構築したい(python + venv)

 1FROM python:3.12-slim
 2WORKDIR /app
 3
 4COPY requirements.txt ./
 5
 6# 仮想環境を作成してパッケージをインストール
 7RUN python -m venv /app/.venv \
 8    && /app/.venv/bin/pip install --no-cache-dir --upgrade pip \
 9    && /app/.venv/bin/pip install --no-cache-dir -r requirements.txt
10
11# 環境変数を設定
12ENV PATH="/app/.venv/bin:$PATH"

標準的なvenvrequirements.txtを使うシンプルなPython環境構築です。

ポイント:

  • python -m venv /app/.venv: 仮想環境を作成

  • /app/.venv/bin/pip install: 仮想環境内のpipを使用してインストール

  • --no-cache-dir: pipのキャッシュを無効化してイメージサイズを削減

  • --upgrade pip: pipをアップグレードして最新版を使用

シェル形式とexec形式の違い

1# シェル形式(シェルを経由して実行)
2RUN apt-get update && apt-get install -y curl
3
4# exec形式(シェルを経由さない)
5RUN ["/bin/bash", "-c", "apt-get update && apt-get install -y curl"]

シェル形式:

  • コマンドを文字列として記述

  • パイプ(|)やリダイレクト(>)が使える

  • シェル変数展開が可能

exec形式:

  • コマンドを配列として記述

  • シェルを経由しないため高速

  • シェル変数が展開されない

通常はシェル形式を使い、パイプやリダイレクトが不要な場合のみexec形式を検討します。

キャッシュをクリアしたい

1RUN pip install --no-cache-dir package-name
2RUN npm install --no-save && npm cache clean --force
3RUN apt-get clean && rm -rf /var/lib/apt/lists/*

各パッケージマネージャーのキャッシュをクリアすることで、イメージサイズを削減できます。

  • pip: --no-cache-dirオプション

  • npm: npm cache clean --force

  • apt: apt-get cleanrm -rf /var/lib/apt/lists/*

注意事項

注釈

RUN . venv/bin/activateのような仮想環境の「活性化」は、 別のRUNコマンドでは無効になります。 代わりに、PATHをENVで設定するか、フルパスでコマンドを実行してください。

警告

複数のRUNコマンドに分割するとレイヤー数が増加し、 イメージサイズが大きくなります。 できるだけ&&で連結して1つのRUNにまとめてください。

リファレンス