docker 遇到 bash: No such file or directory 或 sh: not found等问题
docker 遇到 bash: No such file or directory 或 sh: not found等问题猜测一: 该文件目录在宿主机的inode和在Docker内的inode不一致猜测二: 该程序在docker容器内缺少运行所依赖的库衍生问题为了可以方便使用宿主机工具包,docker volume了宿主机的工具包目录,在容器内使用挂载目录的工具包时出现bash: xxx: No..
docker 遇到 bash: No such file or directory 或 sh: not found等问题
为了可以方便使用宿主机工具包,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
更多推荐
所有评论(0)