Docker缺少libnsl动态库
1:为了和客户docker环境保持一直要使用基础镜像:openjdk:8-jdk-oraclelinux8
这个版本号是个tag,tag用docker list是查不到的,可以直接docker pull到本地,Dockerfile里直接From使用。
2:为了和客户的版本号保持一直还要升级最新的Docker版本,我用之前的版本打出来的镜像只能使用-v参数进行目录映射而且需要加--privileged=true,不然镜像里的项目占位符无法解析。
3:使用的上面的基础镜像有一个问题,如果项目依赖libnsl.so.1函数库会报错,这个问题折磨了我好久,上网搜了很多方法,在Dockerfile中以各种姿势下载这个libnsl打镜像都不成功。
最后没法子问了客户的运维,还是专业的人有见解,一下子给我解决了。就是在Dockerfile中添加:
RUN microdnf install -y libnsl
这样打镜像的时候会自动下载这个动态库,启动镜像的时候还报错了一个错误:
terminate called after throwing an instance of 'std::runtime_error' what(): locale::facet::_S_create_c_locale name not valid
可能是语言包支持的问题,在启动脚本里加上:
export LC_ALL="C"
解决问题。
虽然简简单单写了几句,但是上面三个问题花了我两天的时间来搞,哎还是要继续努力呀。关于Docker升级上传的文档参考。
对了对于os的动态库,可以使用ldd file查看这个函数库依赖了那些函数库,如果缺少的话结果会显示not found,我的环境是如下的情况。
然后就是动态库加载的路径可以通过下面的参数进行设置。上面的Indigo目录就是自定义设置的。
export LD_LIBRARY_PATH=***