生产 Azure 应用服务的实体框架数据库迁移(在 Dockerfile 中使用 SqlCmd?)

问题描述 投票:0回答:0

我有一个 Azure 应用程序服务“用于 docker 容器的 Web 应用程序”,它需要在 Web 应用程序上线之前运行实体框架数据库迁移。 MS Documentationhere too)表示 Web 应用程序不应启动迁移。所以我假设迁移必须来自 docker 图像中的运行时命令......包含 Web 应用程序的相同 docker 图像。我说“运行时”是因为我的 Azure ARM 部署利用了 github CI/CD“操作”,它在部署时没有迁移功能。无论如何,相应的多阶段 dockerfile 正确生成了我需要的

migration.sql
文件,但我不确定随后如何安装和执行必要的
SqlCmd.exe
(在运行时)运行之前的
migration.sql
文件作为参数。

下面是我现在的dockerfile(针对Windows Server,不是Linux),最初是Visual Studio 2022为我生成的。我做的主要修改是安装“dotnet EF”迁移工具,以及构建命令迁移脚本。

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
#For more information, please see https://aka.ms/containercompat

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0-windowsservercore-ltsc2022 AS build
RUN dotnet tool install --global dotnet-ef
#ENV PATH="$PATH:/root/.dotnet/tools"
WORKDIR /src
COPY ["Alereem.WebAPI/Alereem.WebAPI.csproj", "Alereem.WebAPI/"]
COPY ["Alereem.Data/Alereem.Data.csproj", "Alereem.Data/"]
RUN dotnet restore "Alereem.WebAPI/Alereem.WebAPI.csproj"
COPY . .
WORKDIR "/src/Alereem.WebAPI"
RUN dotnet build "Alereem.WebAPI.csproj" -c Release -o /app/build
RUN dotnet ef migrations script -p ../Alereem.Data/Alereem.Data.csproj -s ./Alereem.WebAPI.csproj -o /app/publish/migrations.sql

FROM build AS publish
RUN dotnet publish "Alereem.WebAPI.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# HOW DO I ADD AN INSTALLATION OF 'SQLCMD.EXE'?
# AND HOW DO I ADD THE INVOCATION OF SQLCMD, ALLOWING
# FOR THE DB CONNECTION STRING TO BE PASSED AT RUN-TIME
# AS AN ENVIRONMENT VARIABLE?
# ...<RUN SQLCMD.EXE MIGRATION HERE>...
# THEN RUN MAIN APPLICATION...
ENTRYPOINT ["dotnet", "Alereem.WebAPI.dll"]

我在最后添加的 dockerfile 注释代表了我遇到的问题。我发现在线文档建议我可以使用已经安装了

sqlcmd
的罐装基础图像,但我认为不幸的是我必须将基础图像保留在 Visual Studio 为我的 Azure App Service 应用程序创建的基础图像之上。此外,根据 this SO post,我了解到在 dockerfile 中运行两个运行时可执行文件不是“正常”的。

此时,我需要执行以下操作之一:

  • 简单弄清楚如何让上面的dockerfile运行一个迁移。也许使用最后一个链接中的技巧?这主要是这个问题的内容。
  • 开始在我的 Azure Web 应用程序中使用Docker Compose(预览中的功能)。一个容器将运行迁移,另一个将运行应用程序。这个选项可能是理想的,尽管我对使用“预览”功能来满足我的生产需要持谨慎态度。
  • 放弃,让迁移从我的应用程序内部运行(尽管 文档警告不要这样做)。
  • 找到一种运行以上都不是的迁移的方法。例如,this SO Post 本质上是尝试通过使用“部署时 PowerShell”脚本来解决相同的问题。我不知道什么平台支持这种所谓的“部署时间”操作——帖子没有说。所以我不知道我能不能用这个。

关于最后一点:同样,我正在为我的 CI/CD 使用 github“actions”。我不知道 github 构建代理连接到我的 Azure 租户中的目标数据库的方法。即使有办法实现这一点,我也需要通过简单地执行我的 Azure ARM 模板来进行complete 部署。这意味着我无法选择手动编辑 github“actions”文件来支持部署。这就是为什么我似乎只能选择让 docker 图像负责导致迁移......一旦它在运行时启动。

指导将不胜感激。

entity-framework-core azure-web-app-service github-actions entity-framework-migrations docker-for-windows
© www.soinside.com 2019 - 2024. All rights reserved.