M1 Pro MacBook上Docker构建Rosetta错误的解决方案咨询
问题场景与错误日志
在M1 Pro MacBook(ARM64架构)上构建Docker容器项目时,出现以下Rosetta相关错误:
59.35 59.35 2023-08-17 03:27:46 (15.7 MB/s) - ‘/usr/local/bin/swagger’ saved [22016032/22016032] 59.35 59.36 rosetta error: failed to open elf at /lib64/ld-linux-x86-64.so.2 59.36 ./build/build_swagger.sh: line 6: 100 Trace/breakpoint trap swagger flatten "${scriptdir}"/../server/source/swagger-specs/index.yaml -o "${scriptdir}"/../server/source/swagger-specs/api.yaml --format=yaml --with-flatten=full ------ Dockerfile:42 -------------------- 40 | COPY --from=crypt-dep /src/crypt/b64utils.h /dist/b64utils.h 41 | COPY --from=crypt-dep /src/crypt/cryptlib.h /dist/cryptlib.h 42 | >>> RUN ./build/build_go_deps.sh 43 | 44 | RUN chmod 755 /go/src/lakehouse/bin/restapi-server -------------------- ERROR: failed to solve: process "/bin/sh -c ./build/build_go_deps.sh" did not complete successfully: exit code: 133 make: *** [docker] Error 1
补充:build_go_deps.sh脚本内容如下:
#!/bin/bash set -e scriptdir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) echo "Installing swagger..." curl -L https://github.com/go-swagger/go-swagger/releases/download/v0.29.0/swagger_linux_amd64 -o /usr/local/bin/swagger chmod +x /usr/local/bin/swagger "${scriptdir}"/build_swagger.sh echo "Installing go dependencies..." go mod download
问题解答
该错误是否与ARM平台的Docker支持相关?
是,直接相关。M1 Pro属于ARM64架构,脚本中下载的swagger_linux_amd64是x86_64架构的二进制程序。Docker在Apple Silicon上运行x86程序依赖Rosetta 2转译,但当前容器内缺少x86程序必需的动态链接器/lib64/ld-linux-x86-64.so.2,导致Rosetta无法完成转译,触发错误。
解决方案
1. 使用ARM64原生版本的swagger
修改build_go_deps.sh中的curl命令,替换为对应ARM64架构的swagger下载链接:
curl -L https://github.com/go-swagger/go-swagger/releases/download/v0.29.0/swagger_linux_arm64 -o /usr/local/bin/swagger
原生ARM二进制无需Rosetta转译,从根源解决架构不兼容问题,同时性能更优。
2. 启用Docker的Rosetta模拟并指定x86平台
- 打开Docker Desktop设置,在「Features in development」中勾选「Use Rosetta for x86/amd64 emulation on Apple Silicon」;
- 构建镜像时指定x86平台参数,确保容器使用x86兼容环境:
此方式下Docker会通过Rosetta模拟x86环境,且对应的x86基础镜像会自带所需的动态链接器。docker build --platform linux/amd64 .
3. 手动安装x86动态链接器(临时方案)
若必须使用x86版本的swagger,可在Dockerfile中执行RUN命令安装x86架构的C库(以Debian/Ubuntu系镜像为例):
RUN apt-get update && apt-get install -y libc6-amd64
该操作会在容器内添加/lib64/ld-linux-x86-64.so.2,让Rosetta能够正常转译x86程序。
内容的提问来源于stack exchange,提问作者Aromal Santhosh
相关产品推荐
相关产品推荐

