一、说明
基于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
Comments NOTHING