You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复Docker运行pmmp/PocketMine-MP镜像时的exec format error错误?

解决Docker运行PocketMine-MP时的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

火山引擎 最新活动