Github Action构建ARM64/v8 Docker镜像时遇Segmentation fault错误
解决ARM64/v8架构下Docker构建.NET镜像时
dotnet restore段错误问题 问题背景
在通过GitHub Actions构建适配树莓派Ubuntu 22.04 ARM64/v8架构的.NET 8 Docker镜像时,dotnet restore步骤触发Segmentation fault (core dumped)错误,退出码139,但amd64架构构建完全正常。
解决方案
方案1:禁用.NET诊断特性
在Dockerfile的build阶段,运行dotnet restore前添加环境变量COMPlus_EnableDiagnostics=0,关闭.NET的诊断功能以规避QEMU模拟下的兼容性问题:
修改后的Dockerfile build部分:
ARG DOTNET_VERSION=8.0 FROM mcr.microsoft.com/dotnet/aspnet:$DOTNET_VERSION AS base USER app WORKDIR /app EXPOSE 8080 EXPOSE 8081 ARG DOTNET_VERSION FROM mcr.microsoft.com/dotnet/sdk:$DOTNET_VERSION AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src # 添加环境变量禁用诊断特性 ENV COMPlus_EnableDiagnostics=0 COPY ["Directory.Build.props", "."] COPY ["Imagenerator.Api/Imagenerator.Api.csproj", "Imagenerator.Api/"] RUN dotnet restore "./Imagenerator.Api/Imagenerator.Api.csproj" COPY . . WORKDIR "/src/Imagenerator.Api" RUN dotnet build "./Imagenerator.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./Imagenerator.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Imagenerator.Api.dll"]
方案2:合并restore与build步骤
删除单独的dotnet restore命令,用dotnet build --restore合并依赖还原与构建操作,减少QEMU模拟下的出错点:
修改后的Dockerfile build部分:
ARG DOTNET_VERSION=8.0 FROM mcr.microsoft.com/dotnet/aspnet:$DOTNET_VERSION AS base USER app WORKDIR /app EXPOSE 8080 EXPOSE 8081 ARG DOTNET_VERSION FROM mcr.microsoft.com/dotnet/sdk:$DOTNET_VERSION AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Directory.Build.props", "."] COPY ["Imagenerator.Api/Imagenerator.Api.csproj", "Imagenerator.Api/"] COPY . . WORKDIR "/src/Imagenerator.Api" # 合并依赖还原与构建 RUN dotnet build "./Imagenerator.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build --restore FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./Imagenerator.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Imagenerator.Api.dll"]
方案3:优化Buildx配置
调整GitHub Actions中的Buildx设置,禁用构建溯源并优化网络配置:
修改Workflow中的对应步骤:
- name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: driver-opts: | network=host - name: Build and push uses: docker/build-push-action@v6 with: context: . file: ${{ vars.DOCKERFILE_PATH }} push: true tags: | "${{ vars.IMAGE_NAME }}:latest" platforms: ${{ vars.BUILD_PLATFORM }} build-args: | "DOTNET_VERSION=${{ vars.DOTNET_VERSION }}" provenance: false
验证
推送修改后的配置到仓库,手动触发Workflow,确认ARM64/v8架构的镜像能成功构建并推送到GitHub Container Registry。
内容的提问来源于stack exchange,提问作者TheSecurity
相关产品推荐
相关产品推荐

