背景
我遇到的现象是这样的,我在docker安装了dm python的客户端,但dm python实际上是对libdmdpi.so的调用,在交互式环境中(/bin/bash)调用python 连接达梦是没有任何问题的,但在非交互环境直接调用(/bin/python3)时会报libdmdpi.so: cannot open shared object file: No such file or directory。
问题
原因是搭建时修改的是.bashrc
export DM_HOME=/root/dm_python
export LD_LIBRARY_PATH=$DM_HOME/bin:$LD_LIBRARY_PATH
export PATH=$PATH:$HOME/bin:$DM_HOME/bin
这种shell文件只有在用户登陆后,才会加载。/etc/profile文件也是这样的,只有在用户登陆时才会加载,一般在进行linux开发时,都会登陆用户,再运行程序,所以不会有上面的问题。
但在docker中,可以直接运行程序,无需登陆,从而不加载这个文件。
解决
思路:在容器中写一个sh,source下环境变量,再调用程序,这样就可以了。
vi /bin/python.sh
添加如下信息:
#!/bin/bash
para=""
for arg in "$@"
do
para="$para $arg"
done
source ~/.bashrc
python3 $para
外部调用的时候直接调用python.sh即可
如:
docker run --net=host -v /xxx/xxx/xxx:/usr/src/myapp -w /usr/src/myapp 镜像名 python.sh -version