M1 Mac下Docker容器运行报错qemu: uncaught target signal 11求助
解决方案
换用官方ARM兼容的Node基础镜像
别再用mhart/alpine-node了,直接用官方Node镜像,比如node:16-alpine或者node:16-bullseye-slim。官方镜像现在原生支持多架构,Docker会自动匹配M1的ARM架构,不需要qemu转译,从根儿上解决架构兼容问题。彻底清理Docker缓存和旧镜像
之前折腾各种架构镜像留下的缓存可能搞事情,执行下面的命令清干净:docker system prune -a docker builder prune -a清完重新构建镜像,保证用的是最新的适配ARM的基础镜像层。
检查并重构项目的原生依赖模块
如果项目里用到bcrypt、canvas、sharp这类原生Node模块,它们是跟CPU架构绑定编译的。在M1上构建时得确保这些模块是针对ARM架构重新编译的:- 删除本地的
node_modules和package-lock.json/yarn.lock - 在Dockerfile里加
RUN npm rebuild或者RUN yarn rebuild步骤,让构建阶段针对当前架构重新编译原生模块 - 别直接把本地编译好的
node_modules复制到镜像里,一定要在镜像内重新安装依赖
- 删除本地的
明确指定ARM64架构构建镜像
直接指定构建ARM64架构的镜像,别让Docker默认用amd64转译:
用docker build的话:docker build --platform linux/arm64 -t your-image-name .用docker-compose的话,在配置里加平台指定:
services: your-service: build: context: . platform: linux/arm64 # 其他服务配置关掉Docker的qemu转译功能
有时候强制关闭qemu转译能解决段错误,打开Docker Desktop的设置,找到"Features in development",关掉"Use the new Virtualization framework";或者在终端执行:export DOCKER_DEFAULT_PLATFORM=linux/arm64之后重启Docker Desktop。
内容的提问来源于stack exchange,提问作者S..
相关产品推荐
相关产品推荐

