Mac M1(arm64)环境Docker构建wget报错(exit code:139)求助
M1芯片Docker构建时wget执行报错(exit code 139)的解决方法
问题场景
使用Mac M1(arm64)芯片构建基于openjdk:8-jdk-alpine的Docker镜像时,执行wget下载命令出现exit code: 139错误。拆分RUN命令后定位到报错行:
RUN wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip
进入容器调试发现wget无法识别完整参数,加双引号也无效。
解决方法
1. 替换wget为curl
alpine镜像中的wget在arm64架构下存在兼容性问题,改用curl替代:
RUN curl -sSL -o /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip
参数说明:
-s:静默模式,不显示进度-S:显示错误信息-L:跟随重定向-o:指定输出文件路径(对应wget的-O)
2. 指定构建平台为linux/amd64
利用Docker的QEMU模拟amd64架构执行构建,命令改为:
docker build --platform linux/amd64 -t tag:name .
注意:这种方式会有一定性能损耗,但能直接解决架构不兼容问题。
3. 使用arm64适配的基础镜像
替换基础镜像为官方支持arm64的openjdk8镜像:
FROM arm64v8/openjdk:8-jdk-alpine
该镜像专门适配arm64架构,内置工具(包括wget)可正常运行。
关于禁用/bin/sh -c的说明
Docker的RUN命令默认通过/bin/sh -c执行,若要改用bash直接执行,可将命令写成exec格式:
RUN ["bash", "-c", "wget -q -O /tmp/downloads/file.zip https://repo1.maven.org/maven2/file.zip"]
但此方法仅改变执行shell的方式,不一定能解决当前的架构兼容性问题,建议优先尝试前面的三种方案。
内容的提问来源于stack exchange,提问作者TriNguyen
相关产品推荐
相关产品推荐

