如果它不在我面前,我就不会相信。
所以这显然是一个老主持人,我甚至没有寻找解决方案,只是告诉你我所看到的,所以下一个可怜的灵魂在谷歌上搜索这些废话时不会感到那么孤独。
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)
在同一主机上执行同样的事情,但首先
docker run -ti ubuntu:20.04 /bin/bash
没问题。当主机是 20.04 时,两者也都可以工作。不仅仅是 nodejs。
root@f0bb472a2a44:/# curl www.google.com
curl: (6) getaddrinfo() thread failed to start
相当奇怪。我发现 16.04 w/Epyc 无法工作,而 20.04/Xeon 可以工作。如果有人能重现,我会非常好奇。内存充足,pid 计数和线程计数相对较低,整体系统负载适中。
为了完整起见,我尝试使用 ubuntu:21.10 进行相同的操作,并且它也有效。
是什么原因导致 docker 22.04 中这些线程创建失败?主机内核?底层硬件?还是其他原因?
答案1
我能够在 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
有关 docker seccomp 安全的更多信息: https://docs.docker.com/engine/security/seccomp/
答案2
您绝不应该使用“seccomp=unconfined”,这是最不安全的。
npm docker security settings error node::WorkerThreadsTaskRunner::DelayedTaskScheduler::Start
node[8]: ../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.
我在 Ubuntu 22.04 的 docker 中使用 npm nodejs express 时遇到了这个问题,我将原始的 docker seccomp 文件逐行与我自己的文件进行了比较(https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)
我在上面添加了很多行,但错误修复行需要添加
{
"names": [
"reboot"
],
"action": "SCMP_ACT_ALLOW",
"args": [],
"comment": "",
"includes": {
"caps": [
"CAP_SYS_BOOT"
]
},
"excludes": {}
},
所以我的运行命令看起来像
docker run --security-opt seccomp:<YOUROWNSecComp.json> -it <IMAGENAME>
答案3
如果您的 Docker 版本早于 20.10.10,请先更新该版本。clone3
在此版本之前,Docker 默认不公开 syscall。