c# - Docker:dotnet ef 数据库更新失败
问题描述
我刚刚开始在我的项目上使用 EF docker ef database update
,当我从项目文件夹本地运行它时,该命令运行完美。
但是,当我尝试使用 docker 部署应用程序时,它会失败:
RUN dotnet ef database update
我收到以下错误消息:
An error occurred while accessing the IWebHost on class 'Program'. Continuing without the application service provider. Error: The configuration file 'appsettings.json' was not found and is not optional. The physical path is '/src/WebApp/FileManager.WebApp/bin/Debug/netcoreapp2.2/appsettings.json'.
Unable to create an object of type 'FileManagerDbContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
The command '/bin/sh -c dotnet ef database update' returned a non-zero code: 1
我的 Program.cs 看起来像这样(默认):
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
我的 dockerfile 看起来像这样:
FROM microsoft/dotnet:2.2.0-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/dotnet:2.2.103-sdk AS build
WORKDIR /src
COPY ["src/filemanager.csproj", "WebApp/FileManager.WebApp/"]
RUN dotnet restore "WebApp/FileManager.WebApp/filemanager.csproj"
WORKDIR /src/WebApp/FileManager.WebApp
COPY . .
RUN dotnet build "filemanager.csproj" -c Release -o /app
RUN dotnet ef database update
FROM build AS publish
RUN dotnet publish "filemanager.csproj" -c Release -o /app
FROM node:11.6.0-alpine as nodebuild
WORKDIR /src
COPY ["src/client", "ClientApp/"]
WORKDIR /src/ClientApp
RUN yarn
RUN yarn build
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
COPY --from=nodebuild /src/ClientApp/build /app/wwwroot
ENTRYPOINT ["dotnet", "filemanager.dll"]
我究竟做错了什么?如果我删除数据库更新,它会成功部署。
解决方案
好的,这是我需要执行的步骤来解决我的问题:
不得不根据这个网站重组我的 Program.cs:https ://www.ryadel.com/en/buildwebhost-unable-to-create-an-object-of-type-applicationdbcontext-error-idesigntimedbcontextfactory-ef-core- 2-修复/
我必须创建一个 DesignTimeDbContextFactory,它使用工厂
DefaultConnection
中找到的字符串创建数据库上下文,appsettings.json
如下所示:
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<FileManagerDbContext>
{
public FileManagerDbContext CreateDbContext(string[] args)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var builder = new DbContextOptionsBuilder<FileManagerDbContext>();
var connectionString = configuration.GetConnectionString("DefaultConnection");
builder.UseSqlite(connectionString);
return new FileManagerDbContext(builder.Options);
}
}
- 在我的 Dockerfile 中,我必须
appsettings.json
在 .csproj 文件旁边显式复制。在我的情况下,这意味着将此命令添加到 Dockerfile:
COPY ["src/appsettings.json", "WebApp/FileManager.WebApp/"]
完成这些步骤后,部署成功。
推荐阅读
- html - 将输入类型日期最小值设置为当前日期角度 12
- git - 我可以使用 Cron 在 macOS 上安排每日提交吗?
- azure - 如何使用 Azure-CLI 将规范导入到 Azure APIM 的版本集中
- kubernetes - 工作节点之间的 Kubernetes 卷复制
- javascript - React jsPdf html2canvas 一些错误
- tradingview-api - TradingView 的图书馆是否收集用户数据?
- javascript - 当前请求不是角度的多部分请求
- java - 带有Windows路径的jar中的属性文件
- javascript - 为政府网站制作通知应用程序
- visual-studio-code - VSCode - 自动从文本空间创建列/缩进