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

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

完整配置验证

  1. 确认所有修改后的文件路径正确:
    • PaymentAPI/Dockerfile:包含EF工具安装步骤
    • PaymentAPI/entrypoint.sh:LF换行符,逻辑正确
  2. 重新构建并启动容器:
    docker-compose down -v
    docker-compose build
    docker-compose up
    

内容的提问来源于stack exchange,提问作者Supernova-Ohee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:32:16