#c# #entity-framework #docker #asp.net-core #.net-core
#c# #entity-framework #docker #asp.net-core #.net-core
Вопрос:
Я только начал использовать 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"]
Что я делаю не так? Он успешно развертывается, если я удаляю обновление базы данных.
Ответ №1:
Итак, вот шаги, которые мне нужно было выполнить, чтобы решить мою проблему:
-
Пришлось реструктурировать мою Program.cs в соответствии с этим сайтом: https://www.ryadel.com/en/buildwebhost-unable-to-create-an-object-of-type-applicationdbcontext-error-idesigntimedbcontextfactory-ef-core-2-fix/
-
Мне пришлось создать 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/"]
После этих шагов развертывание прошло успешно.