我试图将.NET ASP Core Web应用程序包装在Docker容器中,但是Sqlite数据库在该容器中似乎为空。
在控制器中,我执行以下查询:
using (var connection = new SQLiteConnection(_connectionString))
{
connection.Open();
using (var cmd = new SQLiteCommand("SELECT COUNT(*) FROM sqlite_master WHERE type='table';", connection))
{
result = (Int64)cmd.ExecuteScalar();
}
}
_connectionString
的定义如下:
private static readonly string _database = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "LocalDb\\v1\\sqlitedb.db");
Dockerfile:
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "MyApp.dll"]
我使用docker build -t MyApp:dev .
构建并使用docker run -p 8080:80 -e "ASPNETCORE_ENVIRONMENT=Development" MyApp:dev
当我在带有IIS的Visual Studio中运行应用程序时,我得到了预期的表数,但是在docker中它返回了0。此外,当我查询表时,我遇到了SQLiteException: SQL logic error no such table
错误。
当我通过SSH进入容器时,可以看到数据库文件位于期望的位置:app/LocalDb/v1/
任何线索可能是什么问题?
答案 0 :(得分:1)
发现了问题。该容器基于Linux,无法识别带有反斜杠的.db
文件的文件路径。由于某种原因,它创建了一个名为LocalDb\v1\sqlitedb.db
的新文件(不是目录,而是具有该名称的实际文件)。更改路径以正斜杠即可解决。