Docker运行.NET Core5+EF+Sqlite应用出现Segmentation fault如何解决
问题根因
该段错误由Alpine镜像使用的musl libc运行库与EF Core 5.0自带的SQLite原生二进制不兼容导致:EF Core 5.0默认绑定的SQLite原生库是针对glibc编译的,在musl环境下执行会触发非法内存访问,也就是抛出的Segmentation fault错误。
可行解决方案
方案1:保留Alpine镜像,修复依赖配置(兼顾小体积需求)
- 修改Dockerfile的base阶段,添加系统原生SQLite依赖安装:
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base WORKDIR /app EXPOSE 80 # 新增以下依赖安装命令 RUN apk add --no-cache sqlite-libs icu-libs
- 调整项目包引用:移除原有的
Microsoft.EntityFrameworkCore.Sqlite包,改为引用以下两个同版本包,强制EF Core调用系统原生SQLite库:
- Microsoft.EntityFrameworkCore.Sqlite.Core 5.0.9
- SQLitePCLRaw.provider.sqlite3.netstandard 2.0.7
修改后重新发布、构建镜像即可正常运行。
方案2:切换非Alpine基础镜像(操作成本最低)
如果不需要Alpine的极小镜像体积,直接修改Dockerfile的基础镜像即可,无需改动项目代码和包引用:
# 移除镜像名后的alpine后缀,使用Debian系标准镜像 FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80 # 同步修改sdk镜像为非alpine版本,避免跨编译问题 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src
重新构建镜像后即可直接运行。
方案3:升级EF Core补丁版本
可以尝试将所有EF Core相关依赖升级到.NET 5的最终补丁版本5.0.17,微软在后续的5.0版本补丁中修复过部分Alpine环境下的原生依赖兼容问题,升级后有概率直接解决该问题。
内容的提问来源于stack exchange,提问作者DaveR
相关产品推荐
相关产品推荐

