Windows容器下.NET Framework多阶段构建镜像运行报hcsshim创建进程错误
问题原因
- 语法兼容问题:你使用的Windows Server Core基础镜像默认Shell为
cmd.exe,不支持Linux Bash的$()命令替换语法,也没有内置ls命令,因此第二阶段的RUN echo $(ls ./)只会原样输出字符串,无法正常列出目录文件,你无法通过该命令排查文件存在性。 - 拷贝路径错误:MSBuild指定
Configuration=Release编译时,生成的exe默认会输出到bin/Release/子目录下,你直接执行COPY --from=build /app/MyProject/bin .只会把整个Release文件夹拷贝到运行阶段的/output目录下,exe实际路径为/output/Release/MyProject.exe,和ENTRYPOINT指定的根目录下MyProject.exe路径不匹配,因此运行时会提示找不到文件。
解决方法
- 首先修正COPY路径,直接拷贝Release子目录下的输出文件,或者修改MSBuild命令指定输出目录:
直接修正COPY语句即可满足绝大多数场景:COPY --from=build /app/MyProject/bin/Release .
也可以在MSBuild命令中添加/p:OutDir=./publish参数指定输出目录,再COPY对应publish目录即可。 - 排查用的列目录命令替换为CMD兼容语法:把
RUN echo $(ls ./)替换为RUN dir,即可正常输出当前目录下的文件列表。 - 可选配置:如果习惯使用PowerShell语法,可以在Dockerfile开头添加
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"],之后就可以正常使用ls(PowerShell中为Get-ChildItem的别名)等命令。
修正后完整Dockerfile示例
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 AS build WORKDIR /app COPY . . RUN nuget restore MySolution.sln WORKDIR /app/MyProject RUN msbuild /p:Configuration=Release /p:Platform=AnyCPU RUN dir FROM mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-ltsc2019 AS runtime WORKDIR /output COPY --from=build /app/MyProject/bin/Release . RUN dir ENTRYPOINT ["MyProject.exe"]
内容的提问来源于stack exchange,提问作者Pine Code
相关产品推荐
相关产品推荐

