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

docker 内部是 20.04 与 22.04,主机是 16.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)

在同一主机上执行同样的事情,但首先

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。

相关内容