Задать вопрос
@pshevnin

Почему миграция в контейнере (через volume) падает с ошибкой сразу после старта контейнера?

Всем привет, у меня такой вопрос, я использую 8 версию asp net, проект собирается в контейнере, и к нему через -volume подключается папка в которой уже происходит миграция. Вот код файла Program.cs:
using ImageCacheService.Models;
using ImageCacheService.Repositories;
using ImageCacheService.Services;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ApplicationDbContext>(options =>
	options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddLogging(configure => {
	configure.AddConsole();
});

builder.Services.AddScoped<IImageRepository, ImageRepository>();
builder.Services.AddScoped<IImageService, ImageService>();

WebApplication app = builder.Build();
using (IServiceScope scope = app.Services.CreateScope()) {
	ApplicationDbContext dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
	dbContext.Database.Migrate();
}

if (app.Environment.IsDevelopment()) {
	app.UseSwagger();
	app.UseSwaggerUI();
}

app.UseStaticFiles(new StaticFileOptions {
	FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "Images")),
	RequestPath = "/Images",
	ContentTypeProvider = new FileExtensionContentTypeProvider {
		Mappings = { [".avif"] = "image/avif" }
	}
});

//app.UseHttpsRedirection();
app.MapControllers();
app.Run();
, appsettings.json:
{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
        }
    },
    "AllowedHosts": "*",
    "ConnectionStrings": {
        "DefaultConnection": "Data Source=Database/ImageCache.db"
    }
}
ApplicationDbContext:
using Microsoft.EntityFrameworkCore;

namespace ImageCacheService.Models {
	public class ApplicationDbContext : DbContext {
		public DbSet<OriginalImage> OriginalImages { get; set; }
		public DbSet<CloneImage> CloneImages { get; set; }

		public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
			: base(options) {
		}

		protected override void OnModelCreating(ModelBuilder modelBuilder) {
			base.OnModelCreating(modelBuilder);

			modelBuilder.Entity<OriginalImage>()
				.HasIndex(o => o.OriginalName)
				.IsUnique();

			modelBuilder.Entity<CloneImage>()
				.HasIndex(o => o.OriginalName)
				.IsUnique();

			modelBuilder.Entity<CloneImage>()
				.HasOne<OriginalImage>()
				.WithMany()
				.HasForeignKey(c => c.OriginalImageId)
				.OnDelete(DeleteBehavior.Cascade);
		}
	}
}
После сборки контейнера, через некоторое время он падает с ошибкой:
Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 5: 'database is locked'.

at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)

at Microsoft.Data.Sqlite.SqliteDataReader.NextResult()

at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)

at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader()

at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()

at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)

at Microsoft.EntityFrameworkCore.Sqlite.Migrations.Internal.SqliteHistoryRepository.AcquireDatabaseLock()

at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)

at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)

at Program.$(String[] args) in /App/ImageCacheService/Program.cs:line 27

info: Microsoft.EntityFrameworkCore.Migrations[20411]

Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.

info: Microsoft.EntityFrameworkCore.Database.Command[20101]

Executed DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

SELECT COUNT(*) FROM "sqlite_master" WHERE "name" = '__EFMigrationsLock' AND "type" = 'table';

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]

Failed executing DbCommand (30,047ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

CREATE TABLE IF NOT EXISTS "__EFMigrationsLock" (

"Id" INTEGER NOT NULL CONSTRAINT "PK___EFMigrationsLock" PRIMARY KEY,

"Timestamp" TEXT NOT NULL

);
При этом, файл .db создался в той папке в которой ожидалось, также внутри контейнера этот файл виден и к нему есть доступ, всё равно падает. Не подскажете в чём может быть проблема?
p.s при запуске через Visual studio (также в контейнере, но с базой данных прямо в контейнере не через volume) всё работает
  • Вопрос задан
  • 54 просмотра
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы