Docker COPY指令无法找到ASP.NET Core 2.1项目dotnet publish生成的release文件
问题根因
- 发布产物输出路径不匹配:执行
dotnet publish未指定具体项目时,每个项目的发布产物会输出到各自项目目录下的out文件夹,而非构建环境根目录的out文件夹。你执行COPY --from=build /out .时是从构建阶段根目录找out文件夹,自然找不到对应文件。 - 项目文件复制错误:Dockerfile中存在一行复制逻辑错误,把ClassLibraryProject3的项目文件错误复制到了ClassLibraryProject1的目录下,会留下后续编译运行的隐患:
# 错误写法 COPY ./ClassLibraryProject3/ClassLibraryProject3.csproj ./ClassLibraryProject1/
解决方案
1. 修正项目文件复制逻辑
把错误的复制行改成正确的路径:
COPY ./ClassLibraryProject3/ClassLibraryProject3.csproj ./ClassLibraryProject3/
2. 调整发布命令,统一输出路径
指定启动项目作为发布目标,同时明确输出到构建阶段根目录的out文件夹,修改dotnet publish命令为:
RUN dotnet publish ./APIProject/APIProject.csproj -c Release -o /out
修改后原有COPY --from=build /out .逻辑不需要改动即可正常生效。
如何查看-o out文件夹的内容
你可以在dotnet publish步骤之后增加目录查询命令,构建过程中会直接输出对应目录的文件列表:
- 如果使用Windows容器(从你的日志路径看是Windows容器),添加命令:
# 查看根目录下所有out文件夹路径 RUN dir /s /b C:\*out* # 直接查看API项目的out目录内容 RUN dir C:\APIProject\out
- 如果使用Linux容器,添加命令:
# 查看所有out文件夹路径 RUN find / -name "out" # 查看API项目的out目录内容 RUN ls -la /APIProject/out
关于基础镜像版本的说明
你当前使用的mcr.microsoft.com/dotnet/core/aspnet:2.1运行时镜像和mcr.microsoft.com/dotnet/core/sdk:2.1SDK镜像版本是兼容的,你的项目目标框架为netcoreapp2.0,2.1版本的SDK和运行时向下兼容2.0版本的项目,不会出现版本适配问题。
修正后完整Dockerfile参考
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build WORKDIR /src COPY *.sln ./ COPY ./APIProject/APIProject.csproj ./APIProject/ COPY ./ClassLibraryProject1/ClassLibraryProject1.csproj ./ClassLibraryProject1/ COPY ./ClassLibraryProject2/ClassLibraryProject2.csproj ./ClassLibraryProject2/ COPY ./ClassLibraryProject3/ClassLibraryProject3.csproj ./ClassLibraryProject3/ COPY ./TestProject/TestProject.csproj ./TestProject/ RUN dotnet restore COPY . . RUN dotnet publish ./APIProject/APIProject.csproj -c Release -o /out FROM base WORKDIR /app COPY --from=build /out . ENTRYPOINT ["dotnet", "APIProject.dll"]
内容的提问来源于stack exchange,提问作者Learning Curve
相关产品推荐
相关产品推荐

