在 Docker 映像中使用 ASP.Net Core 时应用实体框架迁移

Owe*_*ing 8 c# docker entity-framework-core asp.net-core

我有一个 ASP.Net Core 应用程序,它使用带有 Sqlite 的实体框架。我正在构建一个 Docker 镜像来部署它。

使用 VS Code 调试时,ASP.Net Core 应用程序运行良好,但在 Docker 容器中运行时,我收到一个错误:

SqliteException:SQLite 错误 1:“没有这样的表:MyTable”。

我认为这是因为我在构建 Docker 镜像时需要运行实体框架迁移。我已经添加dotnet ef database update到我的 Dockerfile 中,它看起来像:

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

RUN dotnet ef database update

FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "MyApplication.dll"]
Run Code Online (Sandbox Code Playgroud)

图像构建没有错误。但是,当我创建一个容器并查看数据库时,它是空的,没有表。

构建 Docker 镜像时,使用 Entity Framework 设置数据库的正确方法是什么?

Mic*_*h91 20

对于 .net 6 上的任何人,我使用它在启动时在 Program.cs 文件中的 app.Run() 之前应用迁移

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    var context = services.GetRequiredService<ApplicationDbContext>();
    if (context.Database.GetPendingMigrations().Any())
    {
        context.Database.Migrate();
    }
}
Run Code Online (Sandbox Code Playgroud)


M. *_*uiz 5

无论您的部署类型如何,您都可以在运行时在 Configure 方法的最后对 Startup 类应用迁移,例如调用以下方法:

public void ApplyMigrations(ApplicationDbContext context) {
    if (context.Database.GetPendingMigrations().Any()) {
        context.Database.Migrate();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这只应在小型部署(最多 1 个实例)上使用,以确保迁移不会由多个进程并行执行 (5认同)