You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:13:13