Docker构建.NET Framework 4.8项目报错Reached end of stream before end of read
解决方案
- 首先修正Dockerfile的路径逻辑错误:原Dockerfile存在工作路径切换混乱的问题,
nuget restore执行路径和后续msbuild执行路径不一致,会导致还原的NuGet包无法被编译步骤识别。需要统一工作路径,匹配你本地仓库的目录结构,示例修正后的Dockerfile如下:
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build # 容器内创建与本地匹配的仓库根目录 WORKDIR /repoName # 拷贝仓库所有文件到容器内对应目录 COPY . . # 在仓库根目录执行NuGet还原(如果sln在根目录的话) RUN nuget restore # 切换到项目目录执行编译 WORKDIR /repoName/projectName # 编译时禁用Roslyn共享编译服务,规避容器内服务崩溃问题 RUN msbuild ./projectName.csproj /p:Configuration=Debug /p:UseSharedCompilation=false
- 优化
.dockerignore规则:移除路径前不必要的./前缀,新增本地编译缓存目录过滤规则,避免冗余文件干扰构建:
.git .idea .vs gen packages bin obj node_modules irrelevantProject1 irrelevantProject2 # 其他无关目录
- 调整Windows容器内存分配:.NET Framework编译对内存要求较高,Docker Desktop默认给Windows容器的内存配额不足会触发csc.exe崩溃,可在Docker Desktop设置中将Windows容器的内存上限调整到4GB及以上,也可在构建命令中直接指定内存配额:
docker build --memory 4g . - 验证项目引用完整性:确认项目的所有程序集引用、项目引用都是相对路径,不存在依赖本地绝对路径的引用,避免容器内找不到依赖的问题。
内容的提问来源于stack exchange,提问作者Joe Maffei
相关产品推荐
相关产品推荐

