gpt4 book ai didi

docker - 使用容器编排处理 EF Core 迁移

转载 作者:行者123 更新时间:2023-12-02 17:55:51 25 4
gpt4 key购买 nike

我正在构建一个带有 ASP.Net Core、Entity Framework Core 和 PostgreSQL 的 vanilla Web 应用程序,我想使用 Docker 之上的容器编排器(无论是 Docker Swarm 还是 Kubernetes)进行部署。

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

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

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 选项的使用):
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 核心通过 dotnet ef migrations add 生成)。

在开发过程中,我使用 dotnet ef database update
但是,我不能这样做,因为这意味着我在运行时需要 .Net Core SDK(而且我从 SO 帖子和 Microsoft 文档中看到它被认为是一种不好的做法)。

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

如果我遵循这个过程,我的 Dockerfile 将变得像这样(更大更复杂):
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


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

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

谢谢

最佳答案

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

using (var serviceScope = app.ApplicationServices
.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetService<EasyAdminContext>())
{
context.Database.Migrate();
}
}
这样数据库将在应用程序启动时更新

关于docker - 使用容器编排处理 EF Core 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56042283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com