启动容器时报错 "standard_init_linux.go:228: exec user process caused: bad address" 的原因是什么?

What causes the error "standard_init_linux.go:228: exec user process caused: bad address" when starting a container?

我在 EKS Kubernetes 集群的 Pod 容器日志中看到错误“standard_init_linux.go:228:exec 用户进程导致:地址错误”,并寻找可能导致该错误的原因?我试过搜索 Google 和 Whosebug,但所有包含“standard_init_linux.go:228: exec user process caused:”的结果都是因为“地址错误”以外的原因——所以我还没有找到一个很好的解释(例如,有很多关于“exec 格式错误”、“权限被拒绝”、“没有这样的文件或目录”等信息,但似乎没有关于“错误地址”的信息)。出现此错误的 pods 处于 CrashloopBackOff 状态——无法启动,只有容器日志中出现该错误,并且该错误发生在各种应用程序的各种 EC2 工作节点上(即,不同的 Docker 图片)。我的问题是严格的:当它包含“错误地址”时会导致此错误的原因是什么?当 Docker 在包含一些崩溃 pods.

的节点之一上重新启动时,这种情况消失了(在所有节点上)

作为 long-term 错误的 standard_init_linux.go 消费者 :) 我很感兴趣,因为我以前从未见过错误的地址,所以我想深入研究。

我在 https:///github/moby/moby 存储库中搜索字符串 'bad address' 并找到 https://github.com/moby/moby/blob/master/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go#L669,这是 auto-generated 错误列表定义。

// Error table
var errorList = [...]struct {
[snip]
{13, "EACCES", "permission denied"},
{14, "EFAULT", "bad address"},
{15, "ENOTBLK", "block device required"},

这并没有透露太多,但在上下文中它显然是一个标准的失败 errno。查看 Linux 内核源代码 https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno-base.h 证实了这一点。

鉴于此信息,我对 google 搜索 https://google.com/search?q=linux+errno+14+bad+address 有了更好的上下文,而且您很可能在某个地方遇到了代码错误。当代码试图访问有效地址 space 之外时,似乎通常会抛出错误:为什么这不会导致我不知道的 SEGV。如果您有兴趣,值得搜索 'SEGV versus EFAULT'.

考虑到重启 dockerd 解决了这个问题,我认为 dockerd 可能卡住了,这是一个暂时性错误。