MeWrite Docs

COPY failed: file not found in build context

Dockerビルドでファイルが見つからない場合のエラー

概要

COPY failed: file not found in build context は、Dockerビルド時にCOPY命令で指定したファイルがビルドコンテキスト内に見つからない場合に発生するエラーです。

エラーメッセージ

COPY failed: file not found in build context or excluded by .dockerignore: stat app.js: file does not exist
COPY failed: stat /var/lib/docker/tmp/docker-builder123/src: no such file or directory

原因

1. ファイルパスが間違っている

1
2
3
4
5
6
7
8
# NG: ファイルが存在しないパス
COPY app.js /app/

# ファイル構造:
# project/
# ├── Dockerfile
# └── src/
#     └── app.js  ← src/app.js が正しい

2. ビルドコンテキストの外にファイルがある

1
2
# NG: 親ディレクトリのファイルはコピーできない
COPY ../config.json /app/

3. .dockerignoreで除外されている

# .dockerignore
node_modules
*.log
src/  # ← これによりsrc/以下がすべて除外される

4. ビルドコンテキストの指定が間違っている

1
2
3
4
5
6
7
8
9
# NG: 間違ったディレクトリでビルド
docker build -t myapp .

# ファイル構造:
# project/
# ├── docker/
# │   └── Dockerfile
# └── src/
#     └── app.js

解決策

1. 正しいパスを指定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# プロジェクト構造:
# project/
# ├── Dockerfile
# └── src/
#     └── app.js

# OK: 正しい相対パス
COPY src/app.js /app/

# OK: ディレクトリごとコピー
COPY src/ /app/

2. ビルドコンテキストを正しく指定

1
2
3
4
5
6
# Dockerfileの場所を明示
docker build -f docker/Dockerfile -t myapp .

# または、プロジェクトルートからビルド
cd /path/to/project
docker build -t myapp .

3. .dockerignoreを確認

# .dockerignore

# NG: src全体を除外
# src/

# OK: 特定のファイルのみ除外
src/*.log
src/test/
node_modules/
.git/

4. 絶対パスを使用しない

1
2
3
4
5
# NG: 絶対パスはコンテキスト外
COPY /home/user/project/app.js /app/

# OK: コンテキストからの相対パス
COPY app.js /app/

ビルドコンテキストの確認

1
2
3
4
5
# ビルドコンテキストに含まれるファイルを確認
tar -cvf - . | tar -tvf - | head -50

# .dockerignoreを考慮したファイル一覧
docker build --no-cache -t test . 2>&1 | grep "Sending build context"

よくあるパターン

マルチステージビルド

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# ビルドステージ
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY src/ ./src/
RUN npm run build

# 実行ステージ
FROM node:18-slim
WORKDIR /app
# ビルドステージからコピー(コンテキストではなく前ステージから)
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

条件付きCOPY

1
2
3
4
5
6
7
8
# ファイルが存在しない場合に備える
# ワイルドカードで存在する場合のみコピー
COPY package*.json ./
COPY tsconfig*.json ./

# または、デフォルトファイルを用意
COPY config.json* ./
RUN if [ ! -f config.json ]; then echo '{}' > config.json; fi

.dockerignoreのデバッグ

1
2
3
4
5
# .dockerignoreの効果を確認
# 一時的に.dockerignoreを無効化
mv .dockerignore .dockerignore.bak
docker build -t test .
mv .dockerignore.bak .dockerignore

docker-compose での注意

1
2
3
4
5
6
7
# docker-compose.yml
version: '3'
services:
  app:
    build:
      context: .           # ビルドコンテキスト
      dockerfile: docker/Dockerfile  # Dockerfileの場所
1
2
3
# docker/Dockerfile
# コンテキストは docker-compose.yml のある場所
COPY src/ /app/src/  # プロジェクトルートからの相対パス

ADD vs COPY

1
2
3
4
5
6
7
8
# COPY: ローカルファイルのコピーのみ
COPY ./src /app/src

# ADD: URL からのダウンロードや tar の自動展開もサポート
ADD https://example.com/file.tar.gz /app/
ADD archive.tar.gz /app/  # 自動展開される

# 推奨: 単純なコピーには COPY を使用

関連エラー

関連エラー

Docker の他のエラー

最終更新: 2025-12-24