ファイルをコピーしたい(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を確認してください。

リファレンス