docker 内的 20.04 与 22.04,16.04 主机 == 线程启动失败?

Jas*_*ane 11 nodejs docker 16.04 20.04 22.04

如果不是就在我面前,我都不会相信。

所以这显然是一个老主机,我什至不是在寻找解决方案,只是告诉你我所看到的,这样下一个可怜的灵魂在谷歌上搜索这些废话就不会感到那么孤独。

docker run -ti ubuntu:22.04 /bin/bash
# apt update; apt install nodejs
...
E: Problem executing scripts DPkg::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Sub-process returned an error code

root@f0bb472a2a44:/# nodejs
nodejs[2608]: ../src/node_platform.cc:61:std::unique_ptr<long unsigned int> node::WorkerThreadsTaskRunner::DelayedTaskScheduler::Start(): Assertion `(0) == (uv_thread_create(t.get(), start_thread, this))' failed.
 1: 0x7f620e2893cc node::Abort() [/lib/x86_64-linux-gnu/libnode.so.72]
 2: 0x7f620e28945b  [/lib/x86_64-linux-gnu/libnode.so.72]
 3: 0x7f620e30bde2 node::WorkerThreadsTaskRunner::WorkerThreadsTaskRunner(int) [/lib/x86_64-linux-gnu/libnode.so.72]
 4: 0x7f620e30bf16 node::NodePlatform::NodePlatform(int, v8::TracingController*) [/lib/x86_64-linux-gnu/libnode.so.72]
 5: 0x7f620e2542c8 node::InitializeOncePerProcess(int, char**) [/lib/x86_64-linux-gnu/libnode.so.72]
 6: 0x7f620e2544ac node::Start(int, char**) [/lib/x86_64-linux-gnu/libnode.so.72]
 7: 0x7f620d7c2d90  [/lib/x86_64-linux-gnu/libc.so.6]
 8: 0x7f620d7c2e40 __libc_start_main [/lib/x86_64-linux-gnu/libc.so.6]
 9: 0x5563adef00f5 _start [nodejs]
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

在同一主机上执行相同的操作,但从以下开始

docker run -ti ubuntu:20.04 /bin/bash
Run Code Online (Sandbox Code Playgroud)

和..没问题。当主机为 20.04 时,两者也都可以工作。不仅仅是nodejs。

root@f0bb472a2a44:/# curl www.google.com
curl: (6) getaddrinfo() thread failed to start
Run Code Online (Sandbox Code Playgroud)

很奇怪。我发现 16.04 w/Epyc 不工作,而 20.04/Xeon 工作。如果有人可以复制我很好奇。内存充足,pid 计数和线程计数相对较低,总体系统负载适中。

为了完整起见,我在 ubuntu:21.10 上尝试了同样的操作,它也有效。

是什么导致 docker 22.04 中这些线程创建失败?主机内核?底层硬件?还有别的事吗?

小智 9

我能够从 ubuntu:20.04 主机运行 ubuntu:22.04 重现此问题。我相信这是 glibc 的 seccomp 问题,因为我可以使用选项运行它--security-opt seccomp=unconfined

这对我来说运行得很干净:

sudo docker run -it --security-opt seccomp=unconfined ubuntu:22.04 /bin/bash -c "apt update; apt install -y curl; curl www.google.com
Run Code Online (Sandbox Code Playgroud)

有关 docker seccomp 安全性的更多信息: https ://docs.docker.com/engine/security/seccomp/

  • 我有同样的问题,但它是在 Bitbucket Pipelines (BP) 上......不幸的是 BP 不允许使用 `--security-opt` 标志,所以我必须找到另一种方法 (2认同)