以前看过docker的相关教学视频,但是工作后没用到都忘得一干二净了。并且本次所遇到的问题,前面说了忘记了docker相关知识(主要还是太菜了,不过还好有大佬的指导),测试同事也未告知我服务是使用docker技术以容器运行的(甩锅,hh),大概的都交代完了,说下遇到的问题前后经过吧。
测试同事反馈,web页面发下去的策略,终端有收到但是收到的策略内容不完整,我去测试环境模拟下发策略,发现策略缺失的部分为配置策略时上传的规则文件的内容。
通过添加日志发现上层接口获取文件内容时,没有获取到文件内容。上层接口里封装了系统调用函数int open(constchar*pathname,intflags) 以及ssize_t read (int fd, void *buf, size_t count);根据上层接口返回的错误码在底层封装的系统调用open/read处添加日志并且将errno打印出来。发现系统调用open函数执行不成功并且errno为2,即no such file or directory 但是文件明明是存在的,stat命令查看策略下发前后状态,发现文件状态没有发生变化,说明在策略下发前后文件并未被删除。 我自己就写了个demo,使用同样的上层接口去获取文件内容,发现可以获取到文件内容。我就比较疑惑,为什么我们的服务起来去读文件会no such file,而我的demo确实正确的获取到文件内容,并且文件并没有被删除过
后面在公司大佬指导帮助下, 描述下大佬的操作流程
[root@LV7000-342458 leagsoft]
root 176196 1926 0 10:12 pts/0 00:00:07 ./UniServer
root 363374 288844 0 10:53 pts/0 00:00:00 grep --color=auto UniServer
可以看到服务的父进程
[root@LV7000-342458 leagsoft]
root 1926 1398 0 09:38 pts/0 00:00:00 /bin/sh /start_UServer.sh
root 176196 1926 0 10:12 pts/0 00:00:07 ./UniServer
root 363781 1926 0 10:53 pts/0 00:00:00 sleep 3
root 363997 288844 0 10:53 pts/0 00:00:00 grep --color=auto 1926
[root@LV7000-342458 leagsoft]
sbin/ srv/ swapfile sys/
[root@LV7000-342458 leagsoft]
sbin/ srv/ swapfile sys/
发现根目录下并没有这个start_UServer.sh文件,判断服务可能是以容器在运行
[root@LV7000-342458 leagsoft]
def93143318e unios:v1.2 "/start_UServer.sh" 2 hours ago Up About an hour UniServer
然后发现服务确实以容器在运行,给出结论,uniserver服务读取的文件没有映射到容器中
我查了docker相关资料 进行如下操作
[root@LV7000-342458 leagsoft]
"Mounts": [
{
"Type": "bind",
"Source": "/opt/hhd",
"Destination": "/opt/hhd",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/etc",
"Destination": "/etc",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/app/LeagView/Bin",
"Destination": "/opt/app/LeagView/Bin",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/app/LeagView/Dat",
"Destination": "/opt/app/LeagView/Dat",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/app/LeagView/Ini",
"Destination": "/opt/app/LeagView/Ini",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/app/LeagView/Lan",
"Destination": "/opt/app/LeagView/Lan",
"Mode": "ro",
"RW": false,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/app/LeagView/Log",
"Destination": "/opt/app/LeagView/Log",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
发现服务去打开并读取的文件所在的目录确实没有在映射到容器中,所以以容器形式运行服务去打开文件时,当然是no such file。 之后就是检查代码中其它处使用这个上层接口去读的相关目录的汇总(避免服务不能正常提供相关功能)。把目录汇总给相关开发人员,将其映射到容器中。
总结:整个流程下来,并不是很难的问题。但是问题在于未知。主要还是太菜了,继续努力吧
|