Не могу открыть файл базы данных (неправильный путь к файлу)C#

Место общения программистов C#
Anonymous
Не могу открыть файл базы данных (неправильный путь к файлу)

Сообщение Anonymous »

Настройка
Я создаю веб-страницу (планировщик уроков). для этого я использую dotnet 6 и С#. Я запускаю это на коде Visual Studio.
Мои цели
  • Docker-контейнер создает базу данных в процессе сборки.
    -создайте в образе пустую подпапку с именем «persistance», чтобы мое приложение при запуске создавало там новую базу данных, если она еще не существует.
Проблемы
Итак, сейчас моя проблема заключается в том, что при попытке собрать проект выдается следующая ошибка:

Код: Выделить всё

16.19 An error occurred using the connection to database 'main' on server '/root/.local/share/persistance/lessons.db'.
16.23 Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 14: 'unable to open database file'.
это из-за этой строки в Dockerfile:

Код: Выделить всё

RUN mkdir /app/persistance
и

Код: Выделить всё

RUN dotnet ef database update
Я понимаю проблему. В моем контекстном файле я создал базу данных следующим образом:

Код: Выделить всё

public class LessonContext : DbContext
{
public DbSet Lessons { get; set; }

public string DbPath { get; }

public LessonContext()
{
var folder = Environment.SpecialFolder.LocalApplicationData;
var path = Environment.GetFolderPath(folder);
DbPath = System.IO.Path.Join(path,"persistance", "lessons.db");
}

protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={DbPath}");

}
Итак, основная проблема заключается в том, как мне сохранить свою базу данных в контейнере в папке «постоянство». Мой код не работает, поскольку папка находится в /app/persitance.
Dockerfile

Код: Выделить всё

# Use a lean container to run the application
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base

# Create a directory for the app
WORKDIR /app
# Create a directory for persistence
RUN mkdir /app/persistance

# Expose the ports used by the application
EXPOSE 5000
EXPOSE 5001
ENV ASPNETCORE_URLS=http://+:5000

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Use a container that contains the complete SDK to build the container
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build

WORKDIR /src

# Copy and restore dependencies
COPY ["LessonPlaner.csproj", "./"]
RUN dotnet restore "LessonPlaner.csproj"

# Copy the rest of the source code
COPY . .

# Build and publish the application
RUN dotnet publish "LessonPlaner.csproj" -c Release -o /app/publish /p:UseAppHost=false

# Install Entity Framework Core tools
RUN dotnet tool install --global dotnet-ef --version 7.0.5
ENV PATH="$PATH:/root/.dotnet/tools"

# Add EF Core design package
RUN dotnet add package Microsoft.EntityFrameworkCore.Design --version 7.0.5

# Create and apply migrations
#RUN dotnet ef migrations add InitialCreate
RUN dotnet ef database update

WORKDIR /src

# Use the base image for the final stage
FROM base AS final

# Set the working directory to /app
WORKDIR /app

# Copy the published application to the final image
COPY --from=build /app/publish .

# Enable watchtower
LABEL com.centurylinklabs.watchtower.enable="True"

# Change ownership of the /app directory to appuser
USER root
RUN chown -R appuser /app

# Switch back to appuser
USER appuser

# Set the entry point to run the application
ENTRYPOINT ["dotnet", "LessonPlaner.dll"]
Некоторые сведения говорят, что вы можете изменить среду ASP.NET Core на «Производственную» с помощью:

Код: Выделить всё

ENV ASPNETCORE_ENVIRONMENT=Production
Но я новичок в Docker, поэтому не понимаю, как это работает. Итак, попробовал кое-что еще.
Я пытался изменить создание папки «постоянство» в каталоге /root/.local/share/. Для этого я изменил это:

Код: Выделить всё

RUN mkdir /app/persistance
в

Код: Выделить всё

RUN mkdir -p /root/.local/share/persistance
выдает ту же ошибку.
Поэтому я подумал, возможно, папка не создается, для этого я выполнил отладку с помощью следующей команды:

Код: Выделить всё

RUN ls -la /root/.local/share
сразу после создания папки, но ошибок у меня не возникло. (RUN ls -la /root/.local/share)

Подробнее здесь: https://stackoverflow.com/questions/785 ... th-to-file

Вернуться в «C#»