ASP.NET Core 6 Web API多依赖Dockerfile构建问题咨询
ASP.NET Core 6 Web API Docker构建路径错误问题排查与解决
问题场景
尝试为依赖Domain和Application项目的ASP.NET Core 6 Web API构建部署镜像,当前Dockerfile配置如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 8443 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["QueryHub.API.csproj", "API/src/"] COPY ["../../Application/src/QueryHub.Application.csproj", "Application/src/"] COPY ["../../Domain/src/QueryHub.Domain.csproj", "Domain/src/"] RUN dotnet restore "API/src/QueryHub.API.csproj" COPY . . WORKDIR "/src/API/src" RUN dotnet build "QueryHub.API.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "QueryHub.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_ENVIRONMENT Development ENTRYPOINT ["dotnet", "QueryHub.API.dll"]
构建错误信息
=> CACHED [base 2/2] WORKDIR /app 0.0s => CACHED [final 1/2] WORKDIR /app 0.0s => CACHED [build 2/9] WORKDIR /src 0.0s => CACHED [build 3/9] COPY [QueryHub.API.csproj, API/src/] 0.0s => ERROR [build 4/9] COPY [../../Application/src/QueryHub.Application.csproj, Application/src/] 0.0s => ERROR [build 5/9] COPY [../../Domain/src/QueryHub.Domain.csproj, Domain/src/] 0.0s ------ > [build 4/9] COPY [../../Application/src/QueryHub.Application.csproj, Application/src/]: ------ ------ > [build 5/9] COPY [../../Domain/src/QueryHub.Domain.csproj, Domain/src/]: ------ Dockerfile:11 -------------------- 9 | COPY ["QueryHub.API.csproj", "API/src/"] 10 | COPY ["../../Application/src/QueryHub.Application.csproj", "Application/src/"] 11 | >>> COPY ["../../Domain/src/QueryHub.Domain.csproj", "Domain/src/"] 12 | RUN dotnet restore "API/src/QueryHub.API.csproj" 13 | COPY . . -------------------- ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 066d5801-db14-4bdf-93e4-426029f9558a::fh78pkkcdx5om457jxic3fc1y: "/Domain/src/QueryHub.Domain.csproj": not found
项目目录结构
src API src QueryHub.API.csproj Dockerfile tests Domain src QueryHub.Domain.csproj Application src QueryHub.Application.csproj Worker
问题原因
Docker构建时的上下文目录是核心限制:若你在src/API/src目录下执行docker build,此时Docker的上下文根目录就是该目录,COPY指令中使用的../../Application这类相对路径会试图访问上下文目录之外的文件,而Docker守护进程只能读取构建命令指定的上下文目录及其子目录内的文件,因此会出现文件找不到的错误。
解决方法
方法1:迁移Dockerfile到项目根目录(推荐)
- 将
src/API/src/Dockerfile移动到src目录下,修改Dockerfile中的COPY路径:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 8443 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["API/src/QueryHub.API.csproj", "API/src/"] COPY ["Application/src/QueryHub.Application.csproj", "Application/src/"] COPY ["Domain/src/QueryHub.Domain.csproj", "Domain/src/"] RUN dotnet restore "API/src/QueryHub.API.csproj" COPY . . WORKDIR "/src/API/src" RUN dotnet build "QueryHub.API.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "QueryHub.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_ENVIRONMENT Development ENTRYPOINT ["dotnet", "QueryHub.API.dll"]
- 在
src目录下执行构建命令:
docker build -t queryhub-api .
方法2:指定构建上下文(保留原Dockerfile位置)
若不想移动Dockerfile,执行构建时指定上下文为src目录,同时用-f参数指定Dockerfile的具体路径:
docker build -t queryhub-api -f API/src/Dockerfile .
同时需要修改Dockerfile中的COPY路径(因为上下文是src目录,路径需调整为相对src的位置):
# 原路径:COPY ["QueryHub.API.csproj", "API/src/"] COPY ["API/src/QueryHub.API.csproj", "API/src/"] # 原路径:COPY ["../../Application/src/QueryHub.Application.csproj", "Application/src/"] COPY ["Application/src/QueryHub.Application.csproj", "Application/src/"] # 原路径:COPY ["../../Domain/src/QueryHub.Domain.csproj", "Domain/src/"] COPY ["Domain/src/QueryHub.Domain.csproj", "Domain/src/"]
内容的提问来源于stack exchange,提问作者Hardik Dhuri
相关产品推荐
相关产品推荐

