xianlubird / mydocker

<<自己动手写docker>> 源码

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Code-5.4 运行exec时,nsenter报错

yuanshuli11 opened this issue · comments

环境:
Linux version 5.7.13-1.el7.x86_64 (root@1801e27a3031) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC), GNU ld version 2.27-43.base.el7_8.1) #1 SMP Thu Aug 6 05:07:46 UTC 2020
centos7

报错内容:
`
☁ mydocker ./mydocker exec neo sh
{"level":"info","msg":"container pid 2139","time":"2020-12-29T21:51:02+08:00"}
{"level":"info","msg":"command sh","time":"2020-12-29T21:51:02+08:00"}
got mydocker_pid=2139
got mydocker_cmd=sh
setns on ipc namespace failed: Bad file descriptor
setns on uts namespace failed: Bad file descriptor
setns on net namespace failed: Bad file descriptor
setns on pid namespace failed: Bad file descriptor
setns on mnt namespace failed: Bad file descriptor

`
本身是没发现错误的,但是因为在容器中ps -ef仍能看到宿主机的进程。所以打开了 nsenter的fprintf。 然后就报这个错误。

看样子是因为setns 隔离命名空间失败了,但为什么呢? 求教啊

现象是当执行完 ./mydocker run 后 2139 进程就已经挂掉了吧。 所以才会nsenter 失败。 。

我用的WSL,我每运行一次容器,就去查看有没有top进程,直到有top进程后,我再去执行exec,除了mnt其他四个都可以成功执行,mnt的错误提示是:Stale file handle,不知道楼主有没有这样的情况

我用的WSL,我每运行一次容器,就去查看有没有top进程,直到有top进程后,我再去执行exec,除了mnt其他四个都可以成功执行,mnt的错误提示是:Stale file handle,不知道楼主有没有这样的情况

后面不知道为什么,重新敲了一遍代码,又切换回去,又能过了,楼主的代码我也试过,cgo那里缺点东西,在作者的另一个issue那里有解决方案,楼主的问题应该是,运行 -d top 时,top没有在后台运行,可能要多运行几次,通过 ps -ef去查看,有运行了才能通过exec进入容器内部

先请教下楼上的朋友,我run起来一个容器进程之后,也出现bad filedescriptor 这个错误了,我发现对应的ns目录,并没有容器进程的目录,这是直接原因;想请教下,为什么创建容器进程会没有产生这个目录呢