.NET 6项目Docker构建失败:COPY找不到Db项目文件的解决办法
解决.NET 6 Docker构建中找不到MyProject.Db.csproj的问题
你的项目结构如下:
TestProject - MyProject.sln - docker-compose.yaml - MyProject/ - MyProject.csproj - Dockerfile - MyProject.Db/ - MyProject.Db.csproj
构建时出现错误:
ERROR [app build 4/8] COPY [/MyProject.Db/MyProject.Db.csproj, MyProject.Db/]: ------ failed to solve: failed to compute cache key: failed to calculate checksum of ref 9dfeae07-144f-4a1a-9a88-4816eb08f9d9::p80g09cb0geba6x3tewswlfug: "/MyProject.Db/MyProject.Db.csproj": not found
问题根源:当前docker-compose.yaml中app服务的构建上下文设为./MyProject,导致Dockerfile执行时无法访问上层目录的MyProject.Db文件夹。
解决方案(无需移动Dockerfile)
步骤1:修改docker-compose.yaml的app服务构建配置
将app服务的构建上下文改为项目根目录,并指定Dockerfile的完整路径:
version: '3.8' services: database: build: context: ./MyProject.Db dockerfile: Dockerfile ports: - "1433:1433" app: build: context: . # 改为项目根目录作为构建上下文 dockerfile: MyProject/Dockerfile # 指定Dockerfile的位置 ports: - "8080:80" depends_on: - database
步骤2:调整Dockerfile中的COPY命令
由于构建上下文变为根目录,需要修改文件路径以正确复制项目文件:
# Stage 1: Base Image with ASP.NET runtime FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 # Stage 2: Build Image with SDK for compiling the application FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src # 从根上下文复制两个项目的csproj文件 COPY ["MyProject/MyProject.csproj", "MyProject/"] COPY ["MyProject.Db/MyProject.Db.csproj", "MyProject.Db/"] RUN dotnet restore "MyProject/MyProject.csproj" WORKDIR "/src/MyProject" # 只复制MyProject目录下的文件到当前工作目录 COPY ["MyProject/", "."] RUN dotnet build "MyProject.csproj" -c Release -o /app/build # Stage 3: Publish Image for a smaller runtime image FROM build AS publish RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish /p:UseAppHost=false # Stage 4: Final Image with only necessary artifacts FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MyProject.dll"]
原理说明
- 将构建上下文改为项目根目录后,Docker可以访问所有子目录的文件,包括
MyProject.Db。 - 调整COPY命令的路径,确保从根上下文正确复制所需文件,同时避免复制不必要的目录。
内容的提问来源于stack exchange,提问作者HC1122
相关产品推荐
相关产品推荐

