如何修复Docker运行pmmp/PocketMine-MP镜像时的exec format error错误?
exec format error问题 这个standard_init_linux.go:187: exec user process caused "exec format error"错误在Docker场景里,最常见的触发原因是CPU架构不兼容,或是启动脚本的下载/配置存在问题。结合你的Dockerfile内容,我帮你一步步排查修复:
一、先修复启动脚本的下载错误
你Dockerfile里的这行命令存在逻辑冲突:
RUN curl -O https://raw.githubusercontent.com/pmmp/PocketMine-MP/master/start.sh > ./server/start.sh
-O参数会让curl自动将文件保存为原文件名(即start.sh),但你后面又用>重定向输出,这会导致文件内容重复写入甚至损坏。改成下面的正确写法:
RUN curl -o ./server/start.sh https://raw.githubusercontent.com/pmmp/PocketMine-MP/master/start.sh
二、排查CPU架构不兼容问题
你当前下载的PHP包是PHP_Linux-x86_64.tar.gz,这是针对x86_64架构(普通PC、多数云服务器)编译的。如果你的Docker宿主机是ARM架构(比如M1/M2苹果电脑、树莓派、ARM云服务器),就会出现无法执行x86二进制文件的错误。
方案1:下载对应ARM架构的PHP包
替换Dockerfile里的PHP下载命令为对应ARM版本的构建包,比如ARM64架构的版本:
RUN curl -O https://jenkins.pmmp.io/job/PHP-7.2-Linux-ARM64/lastSuccessfulBuild/artifact/PHP_Linux-ARM64.tar.gz
如果是32位ARM设备(比如旧款树莓派),可以找对应32位ARM的构建包。
方案2:强制使用x86_64架构模拟(适合临时测试)
如果暂时找不到对应ARM的PHP包,可以在Dockerfile开头指定平台,让Docker通过QEMU模拟x86_64架构(注意:模拟会带来一定性能损耗):
FROM --platform=linux/amd64 debian:latest
现代Docker Desktop默认已开启QEMU模拟支持,无需额外配置。
三、确保启动脚本的执行权限和Shebang
虽然你已经添加了chmod +x ./server/start.sh赋予执行权限,但有时候下载的start.sh可能缺少正确的Shebang(脚本开头的#!/bin/bash),导致系统无法识别执行解释器。可以在Dockerfile里添加一行补全:
RUN sed -i '1i#!/bin/bash' ./server/start.sh
修复后的完整Dockerfile示例
FROM debian:latest # 若为ARM主机,可替换为 FROM --platform=linux/amd64 debian:latest 或使用ARM版PHP包 RUN apt-get update && apt-get -y install curl git # 此处根据你的CPU架构选择对应PHP包,示例为ARM64版本,x86架构可换回原链接 RUN curl -O https://jenkins.pmmp.io/job/PHP-7.2-Linux-ARM64/lastSuccessfulBuild/artifact/PHP_Linux-ARM64.tar.gz RUN mkdir -p server RUN tar xf PHP_Linux-ARM64.tar.gz --directory ./server RUN curl -o ./server/PocketMine-MP.phar https://jenkins.pmmp.io/job/PocketMine-MP/Development/artifact/PocketMine-MP_1.7dev-615_45b02d92_API-3.0.0-ALPHA10.phar RUN curl -o ./server/start.sh https://raw.githubusercontent.com/pmmp/PocketMine-MP/master/start.sh RUN chmod +x ./server/start.sh RUN sed -i '1i#!/bin/bash' ./server/start.sh CMD ["./server/start.sh", "--no-wizard", "--enable-rcon=on"]
重新构建镜像并运行,应该就能解决这个错误了。
内容的提问来源于stack exchange,提问作者user7885981




