Docker环境下EF持续迁移报错:entrypoint.sh不存在及容器启动失败
问题解决:API容器启动失败与EF迁移执行配置优化
核心错误分析
exec ./entrypoint.sh: no such file or directory 报错主要由三个原因导致:
- 脚本文件路径配置错误
- Windows下创建的脚本使用CRLF换行符,Linux容器无法识别
- 缺少EF Core工具依赖,导致迁移命令无法执行
分步修复方案
1. 修复脚本文件读取问题
- 确认文件位置:将
entrypoint.sh放在PaymentAPI目录下(与Dockerfile同级),因为docker-compose中paymentapi的构建上下文是./PaymentAPI,Dockerfile里的COPY entrypoint.sh .会从该上下文目录复制文件到容器的/app目录。 - 转换换行符:将脚本的换行符从Windows的CRLF改为Linux的LF。可以通过VS Code右下角的换行符切换功能,或使用命令
dos2unix entrypoint.sh完成转换。 - 确保权限正确:Dockerfile中
RUN chmod +x entrypoint.sh步骤已赋予脚本执行权限,无需额外修改。
2. 补充EF Core工具依赖
ASP.NET Runtime镜像(mcr.microsoft.com/dotnet/aspnet:8.0)默认未安装EF Core工具,需在Dockerfile的final阶段添加安装步骤:
# Final stage/image FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app COPY --from=build /app/publish . # 安装与项目版本匹配的EF Core工具 RUN dotnet tool install --global dotnet-ef --version 8.0.* ENV PATH="$PATH:/root/.dotnet/tools" EXPOSE 8080 COPY entrypoint.sh . RUN chmod +x entrypoint.sh ENTRYPOINT ["./entrypoint.sh"]
3. 优化迁移等待逻辑
保留entrypoint中的循环等待逻辑,确保SQL Server服务完全就绪后再执行迁移:
#!/bin/sh set -e echo "Waiting for SQL Server to initialize..." # 循环执行迁移命令,直到成功 until dotnet ef database update --context PaymentDetailContext; do >&2 echo "SQL Server not ready yet, retrying in 1 second..." sleep 1 done echo "Database migrations completed successfully." exec dotnet PaymentAPI.dll
完整配置验证
- 确认所有修改后的文件路径正确:
PaymentAPI/Dockerfile:包含EF工具安装步骤PaymentAPI/entrypoint.sh:LF换行符,逻辑正确
- 重新构建并启动容器:
docker-compose down -v docker-compose build docker-compose up
内容的提问来源于stack exchange,提问作者Supernova-Ohee
相关产品推荐
相关产品推荐

