実行したい(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ファイルから正確に依存関係をインストール.venvはuvが自動的に作成します
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"
標準的なvenvとrequirements.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 --forceapt:
apt-get cleanとrm -rf /var/lib/apt/lists/*
注意事項
注釈
RUN . venv/bin/activateのような仮想環境の「活性化」は、
別のRUNコマンドでは無効になります。
代わりに、PATHをENVで設定するか、フルパスでコマンドを実行してください。
警告
複数のRUNコマンドに分割するとレイヤー数が増加し、
イメージサイズが大きくなります。
できるだけ&&で連結して1つのRUNにまとめてください。