为什么 pids 会在容器中跳转?

Why do pids jump in a container?

进入一个容器(例如docker rundocker exec)使得下一个创建的进程的PID跳到前面,这是为什么?

例如,在下图中,容器中的第二个进程 (ps) 被分配了 PID 10,而不是 PID 2:

根据这个 answer,Linux 似乎是按顺序分配 PID,是不是总是这样?

曾经与 runc 的维护者 Aleksa Sarai 交谈过,他解释了为什么会这样。

根据设计,golang 运行时生成多个线程来管理一个进程。 runc 是用 golang 编写的,当 building/execing 进入容器时,runc 进程在容器内 运行 有很短的时间(在执行用户请求的可执行文件之前,例如 bash 在 docker exec bash 中)。在 Linux 中,线程和进程都使用同一池中的 id 标识,因此 go 运行时线程被计入容器 pid 命名空间,导致我描述的 pid 跳转。