首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过容器编排处理EF核心迁移

通过容器编排处理EF核心迁移
EN

Stack Overflow用户
提问于 2019-05-08 21:45:38
回答 1查看 2.9K关注 0票数 8

我正在构建一个带有Docker核心、实体框架核心和PostgreSQL的普通web应用,我想使用Docker (无论是Docker Swarm还是Kubernetes)上的容器编排来部署它。

我想知道如何在部署过程中集成我的数据库迁移。

我目前的Dockerfile (我正在使用多阶段构建)是:

代码语言:javascript
复制
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine as builder
COPY . /app
WORKDIR /app
RUN dotnet publish -c Release -o publish

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
COPY --from=builder /app/publish /app/
WORKDIR /app
CMD dotnet MyApp.dll

我的docker-compose.yml (我希望通过docker stack命令使用它,因此它排除了build选项的使用):

代码语言:javascript
复制
version: '3'

services:
    app:
        image: edouardberthe/myapp
        ports:
            - 80:80
        depends_on:
            - db
    db:
        image: postgres:latest
        ports:
            - 5432:5432
        volumes:
            - data:/var/lib/postgresql/data
        environment:
            POSTGRES_USER: myapp_user
            POSTGRES_PASSWORD: myapp_pass
            POSTGRES_DB: myapp_db
volumes:
    data:

现在,我想在每个部署上启动我的迁移(由Entity Framework core通过dotnet ef migrations add生成)。

在开发过程中,我使用dotnet ef database update。然而,我不能这样做,因为这意味着我将在运行时需要.Net核心SDK (而且我已经从SO帖子和微软文档中看到这被认为是一种糟糕的做法)。

我从this discussion on github中看到,使用dotnet ef migrations script --idempotent是一种更好的实践,它在构建时生成一个纯SQL迁移文件,然后在运行时运行此脚本。但是(正如文章中所说的)“唯一的问题是,我还需要一个命令行客户端,用于运行时镜像上使用的数据库。”

如果我遵循这个过程,我的Dockerfile将变得像这样(大得多,也更复杂):

代码语言:javascript
复制
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine as builder
COPY . /app
WORKDIR /app
RUN dotnet publish -c Release -o publish \
    && dotnet ef migrations script --output publish/migrate.sql --idempotent 

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
COPY --from=builder /app/publish /app/
WORKDIR /app
RUN apt-get update \
    && mkdir -p /usr/share/man/man1 \
    && mkdir -p /usr/share/man/man7 \
    && apt-get install --no-install-recommends -y postgresql-client \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean
CMD psql -f migrate.sql && dotnet MyApp.dll

(这两行CMD来自this postthis fix)除了增加了很大的复杂性之外,最后一行mkdir也不能工作,因为我无法访问数据库!我确实知道数据库名称、用户和密码是什么(即使我不认为把它放到Dockerfile文件中是个好主意),但我还不知道host是什么。

在这样的设置中,难道没有更好的方法来处理迁移吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-08-05 13:25:23

我不确定这是否是最佳实践,但您可以从C#代码触发模式升级。您必须在Startup.cs的Configure方法中添加以下代码:

代码语言:javascript
复制
using (var serviceScope = app.ApplicationServices
    .GetRequiredService<IServiceScopeFactory>()
    .CreateScope())
{
    using (var context = serviceScope.ServiceProvider.GetService<EasyAdminContext>())
    {
        context.Database.Migrate();
    }
}

这样,数据库将在应用程序启动时更新

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56042283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档