为了可以方便使用宿主机工具包,docker volume了宿主机的工具包目录,在容器内使用挂载目录的工具包时出现

bash: xxx: No such file or directory 
sh: xxx: not found

本身文件不存在、权限和SELinux等低级问题后,探究问题发生的原因。

猜测一: 该文件目录在宿主机的inode和在Docker内的inode不一致

使用 stat /xxx/xxx 查看文件树inode信息
在这里插入图片描述
在这里插入图片描述
结论: 一致,排除

猜测二: 该程序在docker容器内缺少运行所依赖的库

当可执行程序缺少运行依赖库时,会返回 No such file or directory 或 not found等问题

https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ldd.html
原理: ldd不是个可执行程式,而只是个shell脚本; ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。ld-linux.so模块会先于executable模块程式工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。

使用 ldd /xxx/xxx 查看程序运行依赖库
在这里插入图片描述
发现的确缺少相关依赖包
解决: 安装响应的依赖库

衍生问题

本次问题中遇到的可执行文件是jdk,docker内本身自带一款jdk,为什么宿主机的jdk无法运行,但docker内提前build的jdk可以运行呢?
在这里插入图片描述在这里插入图片描述
宿主机采用的是Oracle jdk,docker 预先安装的是open jdk,而且宿主机的architecture 是x86_64而docker采用的是amd64

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐