在 Docker 中运行应用程序时“无法加载 DLL 'SQLite.Interop.dll' 或其依赖项之一”,但在本地运行良好

Fra*_*rpa 5 sqlite dll system.data.sqlite docker dockerfile

介绍

\n

图书馆似乎经常出现问题SQLite.Interop.dll。只需看看这些其他 StackOverflow 问题即可:

\n\n

我\xe2\x80\x99已经完成了以上所有内容以及更多内容:

\n
    \n
  • 我安装了System.Data.SQLite.CoreNuGet 包,
  • \n
  • 我在 中指定了这些*.csproj元素,
  • \n
  • 我设置x64Any CPU不是
  • \n
  • 等等
  • \n
\n

没有成功。关键要素是应用程序在本地运行得很好,但我需要让它在Docker上运行,而问题就出现在 \xe2\x80\x99s 上。情况是我\xe2\x80\x99m 使用Visual Studio 2022处理.NET Core 3.1控制台应用程序。该应用程序最终将部署在AKSAzure Kubernetes Service)上。当然,首先我需要让它在我的开发机器上本地安装的 Docker 上运行。在 Visual Studio 上构建控制台应用程序项目没有给我带来任何错误,并且它在 Visual Studio 中运行良好。使用适当的 Dockerfile构建其 Docker 映像也不会出现任何问题,但在 Docker 上运行相同的映像会引发以下异常:。目前,该项目已安装 NuGet 包,并且 \xe2\x80\ x99t. 该异常是由控制台应用程序之一引用的项目引发的;该项目同时安装了和NuGet 软件包。控制台应用程序\xe2\x80\x99s 项目仅安装了该软件包(我已经尝试安装该软件包,但没有成功)。现在,所有项目都安装了 NuGet 包(尝试一下),这会导致将其作为依赖项安装Unable to load DLL \'SQLite.Interop.dll\': The specified module could not be found. (Exception from HRESULT: 0x8007007E)System.Data.SQLite.Core*.csprojSystem.Data.SQLite.CoreSystem.Data.SQLiteSystem.Data.SQLite.CoreSystem.Data.SQLiteSystem.Data.SQLiteSystem.Data.SQLite.Core

\n

我尝试过的

\n

我使用了DockerfileVisual Studio 2022 的预组装,它处理所有各种引用的项目:

\n
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base\nWORKDIR /app\n\nFROM mcr.microsoft.com/dotnet/sdk:3.1 AS build\nWORKDIR /src\nCOPY ["ProjectA/ProjectA.csproj", "ProjectA/"]\nCOPY ["ProjectB/ProjectB.csproj", "ProjectB/"]\n#COPY all the other referenced projects\nRUN dotnet restore "ProjectA/ProjectA.csproj"\nCOPY . .\nWORKDIR "/src/ProjectA"\nRUN dotnet build "ProjectA.csproj" -c Release -o /app/build\n\nFROM build AS publish\nRUN dotnet publish "ProjectA.csproj" -c Release -o /app/publish\n\nFROM base AS final\nWORKDIR /app\nCOPY --from=publish /app/publish .\nENTRYPOINT ["dotnet", "ProjectA.dll"]\n
Run Code Online (Sandbox Code Playgroud)\n

由于此 Dockerfile 基于多阶段构建,因此它具有以下几行:

\n
...\nRUN dotnet build "MyProject.csproj" -c Release -o /app/build\n...\nRUN dotnet publish "MyProject.csproj" -c Release -o /app/publish\n...\n
Run Code Online (Sandbox Code Playgroud)\n

首先构建代码,然后发布它。鉴于此dotnet publish,我决定退后一步,确保至少我能够自己发布该项目,以缩小问题范围。我发现将其本地发布到文件夹上也会给我带来一些问题,特别是NU1605错误,它阻止我成功结束该过程。我按照Microsoft 的建议解决了该问题。现在,如果我运行.exe位于发布目标文件夹内的应用程序,该应用程序将按预期工作

\n

是时候最终将其制作为 Docker 镜像了。镜像构建过程很顺利,但是在Unable...运行时出现了错误。SQLite.Interop.dll网上看的,建议直接把文件移到文件夹SQLite.Interop.dllbin里解决问题;事实上,最初,我发现它位于bin\\Release\\netcoreapp3.1\\runtimes\\文件夹内,包括其目录win-x86win-x64子目录。为了摆脱\xe2\x80\x9c这个runtimes文件夹的\xe2\x80\x9d,我尝试将项目发布到本地文件夹上,设置如下:

\n

![在此输入图像描述

\n

事实上,这使得SQLite.Interop.dll直接出现在bin文件夹内并删除了该runtimes文件夹。因此,为了获得与 Docker 相同的结果,我修改了 Dockerfile,如下所示:

\n
...\nRUN dotnet build "MyProject.csproj" -c Release -o /app/build -r win-x64\n...\nRUN dotnet publish "MyProject.csproj" -c Release -o /app/publish -r win-x64\n...\n
Run Code Online (Sandbox Code Playgroud)\n

现在该SQLite.Interop.dll文件也直接出现bin在 Docker 运行容器的文件夹内,所以我当时认为一切都很好,但我仍然遇到了异常。

\n

最后一件事

\n

我发现在本地运行应用程序(而不是在 Docker 中)而不指定目标运行时(因此,将构建过程保持为而Any CPU不是x64),不会引发异常(也就是说,将runtimes/文件夹和其中的两个SQLite.Interop.dll文件保留在 和 中win-x86win-x64子文件夹)。

\n