基于Playwright的Docker镜像在M1 Mac正常,Ubuntu服务器运行报错
解决Docker镜像跨架构运行的"exec /bin/sh: exec format error"问题
问题根源
你使用的mcr.microsoft.com/playwright:v1.18.1-arm64是arm64架构专属镜像,M1 Mac本身是arm64架构,运行自然没问题;但你的Ubuntu服务器大概率是x86_64(amd64)架构,两种架构指令集不兼容,直接运行arm64镜像就会触发执行格式错误。
解决方案
1. 构建跨架构兼容的x86_64镜像
在M1 Mac上利用Docker Buildx工具,指定目标架构为x86_64构建镜像:
docker buildx build --platform linux/amd64 -t your-custom-playwright-image:v1.18.1 .
构建完成后,将这个镜像推送到镜像仓库或直接拷贝到Ubuntu服务器,就能正常运行。
2. 替换为x86_64版本的Playwright基础镜像
修改Dockerfile的基础镜像为对应版本的x86_64版本,Playwright的x86_64镜像通常带有发行版后缀(比如-focal对应Ubuntu 20.04):
FROM mcr.microsoft.com/playwright:v1.18.1-focal RUN apt-get -y update && apt-get -y upgrade ADD build/libs/program.jar /tmp WORKDIR /tmp RUN apt-get -y install openjdk-11-jre-headless && apt-get clean CMD java -jar program.jar
直接用这个Dockerfile构建的镜像,就能在x86_64的Ubuntu服务器上正常执行所有RUN命令。
3. 服务器端启用QEMU架构模拟(临时测试用)
如果不想重新构建镜像,可以在Ubuntu服务器上安装QEMU来模拟arm64指令集,但这种方式会有性能损耗,仅适合临时测试:
sudo apt-get update && sudo apt-get install -y qemu-user-static docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
执行完上述命令后,再运行你的arm64镜像即可临时解决问题,但不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者ShpilevojArsenij
相关产品推荐
相关产品推荐

