Я создаю веб-страницу (планировщик уроков). для этого я использую 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'.
Код: Выделить всё
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}");
}
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"]
Код: Выделить всё
ENV ASPNETCORE_ENVIRONMENT=Production
Я пытался изменить создание папки «постоянство» в каталоге /root/.local/share/. Для этого я изменил это:
Код: Выделить всё
RUN mkdir /app/persistance
Код: Выделить всё
RUN mkdir -p /root/.local/share/persistance
Поэтому я подумал, возможно, папка не создается, для этого я выполнил отладку с помощью следующей команды:
Код: Выделить всё
RUN ls -la /root/.local/share
Подробнее здесь: https://stackoverflow.com/questions/785 ... th-to-file