ファイルをコピーしたい(COPY)
1COPY . .
COPYでホストPCのファイルやディレクトリを、Dockerイメージ内にコピーできます。
ビルドコンテキスト内のファイルのみがコピー対象です。
単一ファイルをコピーしたい
1COPY requirements.txt /app/requirements.txt
2COPY package.json .
COPY <src> <dest>の形式で、ホスト上のファイルをイメージ内にコピーします。
<dest>が相対パスの場合はWORKDIRからの相対位置になります。
複数ファイルをコピーしたい
1COPY package.json package-lock.json ./
2COPY *.py /app/scripts/
ワイルドカード(*)を使って複数ファイルを一度にコピーできます。
ディレクトリをコピーしたい
1# srcディレクトリの内容をappにコピー
2COPY src/ /app/
3
4# srcディレクトリ自体をappにコピー
5COPY src /app/
末尾のスラッシュ(/)でコピー動作が変わります。
src/- ディレクトリの内容をコピーsrc- ディレクトリ自体をコピー
所有者を変更したい(--chown)
1# ユーザー名とグループ名で指定
2COPY --chown=node:node package.json .
3
4# UID/GIDで指定
5COPY --chown=1000:1000 . /app/
--chownオプションで、コピーしたファイルの所有者を指定できます。
マルチステージビルドで別のユーザーが作成したファイルを使用する場合に有効です。
別のステージからコピーしたい(--from)
1# ビルドステージ
2FROM python:3.12 as builder
3WORKDIR /build
4COPY pyproject.toml uv.lock ./
5RUN pip install uv && uv sync --frozen
6
7# 実行ステージ
8FROM python:3.12-slim
9WORKDIR /app
10COPY --from=builder /build/.venv /app/.venv
11COPY src/ ./src/
12ENV PATH="/app/.venv/bin:$PATH"
13CMD ["python", "-m", "src.main"]
--from=<ステージ名>で、マルチステージビルド内の別のステージからファイルをコピーできます。
ビルド成果物のみを最終イメージに含める際に活用されます。
レイヤーキャッシュを活用したい
1FROM python:3.12-slim
2WORKDIR /app
3
4# 良い例:依存関係ファイルを先にコピー
5COPY requirements.txt .
6RUN pip install -r requirements.txt
7COPY . .
8
9# 悪い例:すべてを一度にコピー
10# COPY . .
11# RUN pip install -r requirements.txt
依存関係ファイルを先にコピーすることで、 ソースコード変更時にレイヤーキャッシュが活用され、ビルドが高速になります。
不要なファイルを除外したい(.dockerignore)
# .dockerignore
node_modules/
.git/
.gitignore
*.log
.env
.DS_Store
__pycache__/
*.pyc
.dockerignoreファイルで、コピー対象から除外するファイルを指定できます。
.dockerignoreはビルドコンテキストのルートに配置します。
COPY . .を使用する場合、.dockerignoreに指定したファイルはコピー対象から除外されます。
これにより、イメージサイズを削減し、ビルド時間を短縮できます。
ADDとの違い
1# COPY: 単純なファイルコピーのみ
2COPY requirements.txt .
3
4# ADD: 圧縮ファイルの自動展開、URLからのダウンロードが可能
5ADD archive.tar.gz .
6ADD https://example.com/file.tar.gz .
単純なファイルのコピーにはCOPYが推奨されています。
圧縮ファイル展開、URLダウンロードなどADDの特殊機能が必要な場合のみADDを使用することがベストプラクティスです。
注意事項
注釈
COPYでコピーできるのは、ビルドコンテキスト内のファイルのみです。
親ディレクトリ(../)などのコンテキスト外のファイルはコピーできません。
警告
COPY . .は便利ですが、.dockerignoreを適切に設定しないと、
不要なファイル(.git、ログファイル、キャッシュなど)もコピーされてしまいます。
必ず.dockerignoreを確認してください。