无法创建新的 OS 线程(已经有 2 个;errno=22)

Pet*_*čka 4 docker jwilder-nginx-proxy apple-m1

我有带 M1 的 mac,如果我尝试通过 jwilder 使用 nginx-proxy 运行 docker 容器,则会出现此错误:

api_clever4sms_nginx-proxy | runtime: failed to create new OS thread (have 2 already; errno=22)
api_clever4sms_nginx-proxy | fatal error: newosproc
api_clever4sms_nginx-proxy | 
api_clever4sms_nginx-proxy | runtime stack:
api_clever4sms_nginx-proxy | runtime.throw(0x884500, 0x9)
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/panic.go:530 +0x90
api_clever4sms_nginx-proxy | runtime.newosproc(0xc820026000, 0xc820035fc0)
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/os1_linux.go:149 +0x18c
api_clever4sms_nginx-proxy | runtime.newm(0x932358, 0x0)
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/proc.go:1513 +0x135
api_clever4sms_nginx-proxy | runtime.main.func1()
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/proc.go:125 +0x2c
api_clever4sms_nginx-proxy | runtime.systemstack(0xa8e800)
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/asm_amd64.s:291 +0x79
api_clever4sms_nginx-proxy | runtime.mstart()
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/proc.go:1048
api_clever4sms_nginx-proxy | 
api_clever4sms_nginx-proxy | goroutine 1 [running]:
api_clever4sms_nginx-proxy | runtime.systemstack_switch()
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/asm_amd64.s:245 fp=0xc820020770 sp=0xc820020768
api_clever4sms_nginx-proxy | runtime.main()
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/proc.go:126 +0x62 fp=0xc8200207c0 sp=0xc820020770
api_clever4sms_nginx-proxy | runtime.goexit()
api_clever4sms_nginx-proxy |    /usr/local/go1.6/src/runtime/asm_amd64.s:1998 +0x1 fp=0xc8200207c8 sp=0xc8200207c0
api_clever4sms_nginx-proxy exited with code 2
Run Code Online (Sandbox Code Playgroud)

请问你知道如何解决这个问题吗?

Tim*_*nen 15

Docker 能够通过内置于 Mac 版 Docker Desktop中的qemuamd64进行模拟。arm64

如果 Dockerfile 是为amd64/构建的,则为 /编译的程序仍应通过此模拟运行x86_64amd64

Dockerfile:

FROM --platform=linux/amd64 your_amd64_image
...
Run Code Online (Sandbox Code Playgroud)

或环境变量DOCKER_DEFAULT_PLATFORM=linux/amd64

问题是qemu中似乎有一个bug。

这是一个类似的问题:https ://gitlab.com/qemu-project/qemu/-/issues/340


All*_*len 10

对于其他遇到与此类似的错误但使用不同容器的人来说,@RomanShamborovskyi 上面关于检查 DockerHub 上可用的镜像的提示为我解决了这个问题。就我而言,我的 docker-compose.yml 文件被配置为使用image: redis:3.2.4仅列出支持 的文件linux/amd64,但是,我能够升级到image: redis: 3.2.10支持列出的文件linux/arm/v7,并且在 Docker 中对我有用,而不会遇到错误。如果您可以找到支持arm的软件的类似版本,只需要一个小补丁更新,那么希望它不需要像更新到更高的主要版本号那样重构您的代码。


小智 7

我在 M1 (arm64) 中运行 mysql docker,当我尝试构建容器时遇到相同的错误。我将 mysql docker 映像更改为image: mysql:8.0.26platform: linux/x86_64并添加default_authentication_plugin=mysql_native_password 到 my.cnf 然后我通过这些设置重建一个 docker 容器并且它可以工作。

  • 谢谢,我们有一个旧的“docker-compose.yml”,它使用“mysql:8.0.16”并更新到“mysql:8.0.26”,“platform: linux/amd64”允许 MySQL 在 M1 Mac 上成功启动。 (2认同)

geo*_*riv 7

就我而言,我需要在开发中的功能下的 Docker 配置中启用Use Rosetta for x86/amd64 emulation on Apple Silicon 。

在此输入图像描述


小智 5

您可以在此处看到jwilder 中的所有 nginx-proxy 映像仅针对单个平台 - amd64构建,而您的全新 mac 是arm64

我会尝试做的是从这个镜像的 repo 中获取源代码, 然后自己在 arm64 mac 上本地从 Dockerfile 构建它。这样,当您检查创建的 docker 映像时,您会看到该平台现在是 arm64。您发布的这些异常将消失。

当你做这些事情时,查找作为你想要的镜像的基础镜像链也很重要,即你的镜像是从 nginx:1.19.3-alpine 构建的,你可以在Dockerfile 中看到它。该映像是多平台的,支持 arm64。


小智 5

我对内部 docker 容器也有同样的问题,我检查了 docker 文档,这对我有帮助:https ://collabnix.com/warning-the-requested-images-platform-linux-amd64-does -不匹配检测到的主机平台-linux-arm64-v8/

\n

总而言之:

\n
    \n
  1. 转至“设置”> 部分并选中复选框以启用 Apple虚拟化框架
  2. \n
  3. 在开发部分的 \xe2\x80\x9cFeature\xe2\x80\x9d 下,启用Rosetta
  4. \n
\n