Skip to content

Dockerビルド時の「failed to compute cache key: not found」エラー解決ガイド

問題の概要

Dockerビルド時に以下のエラーが発生する場合があります:

shell
> [build 3/7] COPY [client/client.csproj, client/]:
------
failed to compute cache key: "/client/client.csproj" not found: not found

このエラーは、Dockerが指定されたファイルやディレクトリを見つけられない場合に発生します。特に、Visual Studioでは正常に動作するのに、コマンドラインでのdocker buildで失敗する場合が多く見られます。

主な原因と解決策

1. ビルドコンテキストとDockerfileの位置関係

Visual StudioがDockerビルドを実行する方法は、手動での実行方法と異なります。Visual StudioはDockerfileがあるディレクトリではなく、親ディレクトリからビルドを実行します。

プロジェクト構造の例

ソリューションフォルダ/
├── ソリューション.sln
└── プロジェクトフォルダ/
    ├── Dockerfile
    ├── プロジェクト.csproj
    └── その他のファイル

解決策: ソリューションフォルダに移動し、-fオプションでDockerfileを指定します。

shell
cd /パス/ソリューションフォルダ
docker build -f プロジェクトフォルダ/Dockerfile -t イメージ名 .

2. .dockerignoreファイルの設定

.dockerignoreファイルの設定により、必要なファイルがコピーされない場合があります。

よくある.dockerignoreのミス

dockerignore
*           # すべてのファイルを無視
!dist/      # distフォルダのみ許可

この設定では、distフォルダ以外のすべてのファイルが無視されるため、他の必要なファイル(設定ファイルなど)がコピーされません。

解決策: .dockerignoreファイルを確認し、必要なファイルやディレクトリが除外されていないか確認します。

dockerignore
# 除外する必要のないファイルを追加
!nginx.conf
!appsettings.json
!必要なファイル名

3. パスの表記の間違い

WindowsとLinuxではパスの区切り文字が異なります(\ vs /)。

解決策: Dockerfile内では常にLinux形式のパス(フォワードスラッシュ /)を使用します。

dockerfile
# 間違い
COPY bin\Release\net5.0\publish .

# 正しい
COPY bin/Release/net5.0/publish .

4. ビルドコンテキストの誤り

Dockerビルド時の最後の引数(通常は.)はビルドコンテキストを指定します。このパスが間違っていると、ファイルが見つかりません。

解決策: 正しいビルドコンテキストを指定します。

shell
# プロジェクトフォルダ内で実行する場合
docker build .

# ソリューションフォルダから実行する場合
docker build -f プロジェクトフォルダ/Dockerfile .

詳細なトラブルシューティング

Dockerfileの完全な修正例

元のDockerfileを修正する場合:

dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
# パスを修正(先頭のスラッシュを削除)
COPY ["client/client.csproj", "client/"]
RUN dotnet restore "client/client.csproj"
COPY . .
WORKDIR "/src/client"
RUN dotnet build "client.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "client.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "client.dll"]

その他の一般的な解決策

shell
# ソリューションディレクトリに移動
cd /path/to/solution-folder

# Dockerfileを指定してビルド
docker build -f ProjectFolder/Dockerfile -t your-image-name .
shell
# キャッシュや不要なリソースを削除
docker system prune
shell
# Dockerデーモンの問題を解決
sudo reboot

予防策とベストプラクティス

  1. 一貫したビルド方法の使用: 常に同じ方法でDockerイメージをビルドするようにします(VS内かコマンドラインか)。

  2. .dockerignoreの定期的な見直し: 必要なファイルが誤って除外されていないか定期的に確認します。

  3. マルチプラットフォームの考慮: 開発環境と本番環境でパス区切り文字の違いに注意します。

  4. エントリポイントの確認: DLLファイル名が大文字小文字を含めて正確か確認します。

dockerfile
# プロジェクト名が"MyApp"の場合
ENTRYPOINT ["dotnet", "MyApp.dll"]  # 正しい
ENTRYPOINT ["dotnet", "myapp.dll"]  # 間違い(大文字小文字の違い)

まとめ

「failed to compute cache key: not found」エラーは、主に以下のいずれかが原因で発生します:

  • ビルドコンテキストとDockerfileの位置関係の不一致
  • .dockerignoreファイルによる意図しないファイル除外
  • パス表記の誤り(特にWindowsとLinuxの違い)

Visual Studioとコマンドラインでのビルド方法の違いを理解し、適切なビルドコンテキストを指定することで、この問題は解決できます。