如何使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
但是当我的应用程序运行时,我会收到以下错误
/entertion_for_downloading_and_using_db2_net_core_core_provider_package?lang = en。未经手的例外:system.dllnotfoundexception:无法加载dll 'libdb2.so':找不到指定的模块。
要仔细检查是否正在设置环境变量,我做
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