在 docker 中与 .net 核心建立 DB2 连接时无法装入 DLL 'libdb2.so'



如何使libdb2.so文件可见到db2软件包?我已经证实了该软件包在Ubuntu中起作用,但是我无法在Docker内部使用。

dockerfile

FROM microsoft/aspnetcore:1.0
#assume the built app is in /app from the build so that the entrypoint command runs in the correct path
WORKDIR /app
#need to specify db2 driver lib
ENV LD_LIBRARY_PATH="/app/db2Lib"
#move all the source code in local directory ./app into the container directory /app
COPY ./app .
RUN mkdir -p db2Lib
ADD db2Lib db2Lib/
ADD ./runImage.sh .

RUN chmod -R a+wrx runImage.sh
EXPOSE 8080
ENTRYPOINT ["./runImage.sh"]

runimage.sh

#!/bin/bash
ls $LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH
dotnet app.dll

运行图像后,我在控制台中获得以下印刷品

#from ls $LD_LIBRARY_PATH
icc 
libDB2xml4c.so
libDB2xml4c.so.58
libDB2xml4c.so.58.0
libdb2.so
libdb2.so.1
libdb2clixml4c.so
libdb2clixml4c.so.1
libdb2o.so
libdb2o.so.1
#from echo $LD_LIBRARY_PATH
/app/db2Lib

但是当我的应用程序运行时,我会收到以下错误

未经手的例外:system.dllnotfoundexception:无法加载dll 'libdb2.so':找不到指定的模块。

/entertion_for_downloading_and_using_db2_net_core_core_provider_package?lang = en。

要仔细检查是否正在设置环境变量,我做

Console.WriteLine(Configuration["LD_LIBRARY_PATH"]);

确实打印

/app/db2lib

对于以后的任何参考,该博客说明了使其在Docker上工作所需的内容。该示例与控制台应用程序有关,但也应适用于其他类型的应用程序。 总而言之,您需要在系统中具有libxml2.2.7.6。如果没有,可以将其下载并保存在LIB文件夹中。此libxml2.so.2需要链接到libdb2.so

    ln <libpath>/libxml2.so.2.7.6 <libpath>/libxml2.so.2
In the application's DockerFile, these two entries should be there before the entry point
    ENV LD_LIBRARY_PATH="<libpath>"
    Env PATH=$PATH:"<libpath>/bin:<libpath>/lib"
    ENTRYPOINT ["dotnet", "ConsoleApp1.dll"]

对于最新版本3.1.0.400,我发现所需的LD_LIBRARY_PATH位于/app/clidriver/lib中,通过在我的Dockerfile中执行以下内容:

RUN find / -name clidriver -type d

所以我刚刚安装了libxml2软件包

RUN apt-get update 
    && apt-get install -y libxml2-dev

并设置库路径

ENV LD_LIBRARY_PATH=/app/clidriver/lib

根据环境,在CSPROJ文件中包含正确的软件包也很重要!OS变量在这里很有用,因此它将在Win/Linux系统上使用:

<PackageReference Include="IBM.Data.DB2.Core" Version="3.1.0.400" Condition="'$(OS)' == 'WINDOWS_NT'"/>
<PackageReference Include="IBM.Data.DB2.Core-lnx" Version="3.1.0.400" Condition="'$(OS)' == 'UNIX'"/>

正如@vishwa指出的那样, libdb2.so需要 libxml2.so。我的Dockerfile看起来像这样:

FROM microsoft/dotnet:2.1-sdk
ENV APP_DIR=/app 
    LD_LIBRARY_PATH=/app/bin/clidriver/lib:/app/bin/clidriver/lib/libdb2.so 
    PATH=${PATH}:/app/clidriver/bin:/app/clidriver/lib
RUN set -e; 
    mkdir -p ${APP_DIR}; 
    apt-get update; 
    apt-get install -y libxml2-dev;
WORKDIR ${APP_DIR}
COPY Pastdev.Example.App Pastdev.Example.App
RUN set -e; 
    dotnet build .; 
    dotnet publish --no-restore --no-build 
        -o ${APP_DIR}/bin 
        Pastdev.Example.App/Pastdev.Example.App.csproj
ENTRYPOINT ["dotnet", "/app/bin/Pastdev.Example.App.dll"]

我还希望能够在Docker外部的窗户上构建和运行,因此我设置了.csproj

  <ItemGroup Condition="'$(os)' == 'UNIX'">
    <PackageReference Include="IBM.Data.DB2.Core-lnx" Version="1.2.2.100" />
  </ItemGroup>
  <ItemGroup Condition="'$(os)' == 'Windows_NT'">
    <PackageReference Include="IBM.Data.DB2.Core" Version="1.2.2.100" />
  </ItemGroup>

我可以修复我的项目更新以下ENV变量:

ENV DB2_CLI_DRIVER_INSTALL_PATH="/app/clidriver" 
    LD_LIBRARY_PATH="/app/clidriver/lib" 
    LIBPATH="/app/clidriver/lib" 
    PATH=$PATH:"/app/clidriver/bin:/app/clidriver/lib"

,还安装了此库libxml2:

RUN apt-get -y update && apt-get install -y libxml2

我将项目推到以下仓库:

https://github.com/renatomatos79/docker-netcore-db2-client-api/blob/main/main/dockerfile

最新更新