I have mac with M1 and if i try to run docker container with nginx-proxy by jwilder, I got this error:
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
Please do you know how to solve this?
4
Answers
You can see here that all nginx-proxy images from jwilder are built only for single platform – amd64, while your brand new mac is arm64.
What I would try to do, is to get the sources from this image’s repo
and build it from Dockerfile locally on your arm64 mac by yourself. This way, when you inspect your created docker image, you’ll see that platform is arm64 now. And these exceptions that you posted will be gone.
When you do such things, it also always important to look up the chain of images that are base for your desired image, i.e. your image is built from nginx:1.19.3-alpine, you can see that in Dockerfile. And that image is multiplatform and supports arm64.
Docker has the ability to emulate
amd64
onarm64
through qemu which is built into Docker Desktop for Mac.Programs compiled for
amd64
/x86_64
should still work through this emulation if the Dockerfile is built foramd64
Dockerfile:
or env variable
DOCKER_DEFAULT_PLATFORM=linux/amd64
The problem is that there seems to be a bug in qemu.
Here is a similar problem: https://gitlab.com/qemu-project/qemu/-/issues/340
I run mysql docker in my M1 (arm64) and I got the same error when I try to build a container. I change mysql docker image to be
image: mysql:8.0.26
,platform: linux/x86_64
and adddefault_authentication_plugin=mysql_native_password
to my.cnf Then I rebuild a docker container through those settings and it works.For anyone else who has an error similar to this but with a different container, the tip above by @RomanShamborovskyi about checking which images are available on DockerHub is what solved the issue for me. In my case, my docker-compose.yml file was configured to use
image: redis:3.2.4
which was only listed with support forlinux/amd64
, however, I was able to upgrade toimage: redis: 3.2.10
which was listed with support forlinux/arm/v7
and that worked for me within Docker without encountering an error. If you can find a similar version of your software with arm support that only requires a small patch update then hopefully it won’t require refactoring your code like updating to a higher major version number would.