容器部署缺少so依赖

烂柯 发布于 2023-06-16 142 次阅读


一、说明

基于assimp-net处理模型格式,docker容器运行时提示缺少依赖(错误信息如下),记录处理过程。

System.DllNotFoundException: Unable to load shared library 'libdl.so' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibdl.so: cannot open shared object file: No such file or directory
   at Assimp.Unmanaged.UnmanagedLibrary.UnmanagedLinuxLibraryImplementation.dlopen(String fileName, Int32 flags)
   at Assimp.Unmanaged.UnmanagedLibrary.UnmanagedLinuxLibraryImplementation.NativeLoadLibrary(String path)
   at Assimp.Unmanaged.UnmanagedLibrary.UnmanagedLibraryImplementation.LoadLibrary(String path)
   at Assimp.Unmanaged.UnmanagedLibrary.LoadLibrary(String libPath)
   at Assimp.Unmanaged.UnmanagedLibrary.LoadLibrary()

二、Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /publish
COPY . .
ENV TZ=Asia/Shanghai
#1 RUN ln -s /lib/x86_64-linux-gnu/libdl-2.31.so /usr/lib/libdl.so
#2 RUN cp ./libminizip.so.1 /lib/x86_64-linux-gnu
ENTRYPOINT ["dotnet", "AssimpTest.dll"]

三、问题处理

1、处理so依赖

#1、运行容器
docker run -it --name test test:v1
#2、进入容器
docker exec -it test /bin/bash
#3、查询依赖文件,结果如下
whereis libdl*.so
## root@f5f545f692b4:/lib/x86_64-linux-gnu# whereis libdl*.so
## libdl-2.31: /lib/x86_64-linux-gnu/libdl-2.31.so

#4、dockerfile添加run
# RUN ln -s /lib/x86_64-linux-gnu/libdl-2.31.so /usr/lib/libdl.so

2、libassimp.so加载失败

​ libassimp.so缺少环境依赖导致加载失败,错误信息如下

Assimp.AssimpException: Error loading unmanaged library from path: /publish/runtimes/linux-x64/native/libassimp.so
   at Assimp.Unmanaged.UnmanagedLibrary.UnmanagedLinuxLibraryImplementation.NativeLoadLibrary(String path)
   at Assimp.Unmanaged.UnmanagedLibrary.UnmanagedLibraryImplementation.LoadLibrary(String path)
   at Assimp.Unmanaged.UnmanagedLibrary.LoadLibrary(String libPath)
   at Assimp.Unmanaged.UnmanagedLibrary.LoadLibrary()
   at Assimp.Unmanaged.UnmanagedLibrary.LoadIfNotLoaded()

3、查询依赖

查看libassimp.so环境依赖

ldd /publish/runtimes/linux-x64/native/libassimp.so

libassimp.so缺少libminizip.so依赖,查询结果如下

root@b3d1bbe65e75:/publish# ldd /publish/runtimes/linux-x64/native/libassimp.so
    linux-vdso.so.1 (0x00007ffc91567000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00001546d6708000)
    libminizip.so.1 => not found
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00001546d66fe000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00001546d6531000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00001546d63ed000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00001546d63d3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00001546d61fc000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00001546d61da000)
    /lib64/ld-linux-x86-64.so.2 (0x00001546d70f4000)

4、libmainzip.so加载

#1、运行基础容器
docker run -it --name aspnet6 mcr.microsoft.com/dotnet/aspnet:6.0
#2、安装minizip
apt-get update && apt-get install -y minizip
#3、查找libmainzip
find / -name libminizip*
##查询结果如下
## root@0589d5b1f6c7:~# find / -name libminizip*
## find: '/sys/kernel/slab': Input/output error
## /usr/lib/x86_64-linux-gnu/libminizip.so.1.0.0
## /usr/lib/x86_64-linux-gnu/libminizip.so.1
## ...

#4、拷贝libmainzip.so.1.0.0
docker cp aspnet6:/usr/lib/x86_64-linux-gnu/libminizip.so.1.0.0 .

#5、将libmainzip重命名拷贝build项目下,dockerfile添加run
#RUN cp ./libminizip.so.1 /lib/x86_64-linux-gnu
烂柯

最后更新于 2023-06-16