升级至.NET 7后Docker构建镜像时出现Segmentation fault错误
解决M1 Mac上.NET 7 Docker构建Segmentation fault问题
问题概述
将项目从.NET 6升级至.NET 7后,本地执行dotnet publish命令正常,但通过Docker构建linux/amd64镜像时,发布步骤抛出Segmentation fault错误,回退至.NET 6后问题消失。
环境信息
- 设备:搭载M1芯片的Mac
- 构建参数:已传入
--platform linux/amd64指定目标架构 - Docker基础镜像:
mcr.microsoft.com/dotnet/sdk:7.0(曾尝试bullseye-slim变体,问题未解决)
相关配置与错误输出
Dockerfile发布步骤
RUN dotnet publish \ -c release \ -r linux-x64 \ --no-self-contained \ -p:PublishReadyToRun=true \ -o published \ function/function.csproj
错误输出
#26 4.225 MSBuild version 17.4.0+18d5aef85 for .NET #26 6.047 qemu: uncaught target signal 11 (Segmentation fault) - core dumped #26 6.438 Segmentation fault
可行解决方案
- 禁用PublishReadyToRun编译选项:该选项生成的提前编译二进制文件,在qemu模拟
amd64架构时易触发兼容性崩溃。修改发布命令,移除-p:PublishReadyToRun=true或改为-p:PublishReadyToRun=false:RUN dotnet publish \ -c release \ -r linux-x64 \ --no-self-contained \ -o published \ function/function.csproj - 使用ARM64架构镜像构建:避免qemu跨架构模拟,改用适配M1芯片的ARM64 SDK镜像作为builder,再通过Docker Buildx构建多平台镜像:
构建命令示例:FROM mcr.microsoft.com/dotnet/sdk:7.0-arm64v8 as builder # 后续发布步骤保持不变docker buildx build --platform linux/amd64,linux/arm64 -t your-image:tag . - 更新Docker Desktop:Docker自带的qemu版本可能存在.NET 7兼容问题,更新至最新版Docker Desktop可获取修复后的qemu组件,解决架构模拟时的崩溃问题。
- 指定.NET 7 SDK的更新版本:尝试使用较新的.NET 7 SDK镜像(如
mcr.microsoft.com/dotnet/sdk:7.0.200及以上),官方后续版本可能修复了跨架构构建的相关bug。
内容的提问来源于stack exchange,提问作者Goncalo Oliveira
相关产品推荐
相关产品推荐

