奇点和内部动态库

Singularity and interior dynamic libraries

我目前正致力于在 Singularity 容器中获取更大的 (C++) 项目。到目前为止,一切正常,直到我尝试执行容器镜像,它找不到我之前在容器内构建的动态库文件:

./MyProject.img
/<some path>/MyExecutable: error while loading shared libraries: libmongocxx.so._noabi: cannot open shared object file: No such file or directory

我的第一个想法是,也许在容器内构建这种依赖关系的过程不知何故没有成功,因此我在食谱的 %post 部分末尾添加了 ls /usr/local/lib/ 以检查那个,但一切都很好:

+ ls /usr/local/lib/
[...]
libmongocxx.so
libmongocxx.so.3.6.0
libmongocxx.so._noabi
[...]

所以我的下一个想法是,由于某种原因,基本库文件夹可能不是我容器环境变量的一部分,所以我用

扩展了 %post 部分
export PATH=$PATH:/usr/local/lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

仍然无济于事。

我这里缺少一些 属性 个奇点容器吗?我是否需要以某种方式将动态库文件提取到容器外部?还是我犯了一些在这里看不到的愚蠢错误?

(我现在只用 singularity-container 标记了这个问题,因为我认为这不是 C++ 特有的任何东西,但如果有人不这么认为,请随意添加。我的容器使用 Bootstrap: docker From: ubuntu:18.04, 应该是相关的。)

编辑:为了以防万一,我还明确地授予了动态库执行权,并打印了他们的权利:

lrwxrwxrwx  1 root root       20 Sep 10 10:51 libmongocxx.so._noabi -> libmongocxx.so.3.6.0

也没用。

我的第一个猜测是您的本地环境正在覆盖图像中的变量。您可以使用 singularity run --cleanenv MyProject.img 来防止您当前的环境持久化到容器中。如果有您想要传递的变量,您可以export SINGULARITYENV_SOMEVAR=foo在容器环境中设置SOMEVAR=foo

如果不行,请修改 %runscript 以在其中添加一个 env | sort,这样当它尝试 运行 您的代码时,您可以准确地看到设置的内容。