如何修复适配Ubuntu 16.04的Docker镜像?解决exec格式错误
解决Docker运行PocketMine-MP时的
exec format error问题 这个错误standard_init_linux.go:185: exec user process caused "exec format error"本质就是镜像里的可执行文件和你的Ubuntu 16.04宿主机CPU架构不兼容,结合你给出的Dockerfile片段,问题出在你指定的POCKETMINE_BINARY是x86_64架构的版本,但你的机器(或Docker运行环境)并非这个架构,或者你跨架构构建镜像时没做适配。
下面是具体的排查和解决步骤:
1. 先确认你的机器CPU架构
在Ubuntu终端执行这条命令,查看自己的CPU架构:
uname -m
- 如果输出是
x86_64:说明你是64位x86机器,可能是二进制包下载错误,或者跨架构构建出了问题 - 如果输出是
armv7l/aarch64:说明你用了ARM架构的机器(比如树莓派),需要替换成对应ARM版本的PocketMine二进制 - 如果输出是
i686:说明你是32位x86机器,需要用32位的PocketMine二进制
2. 针对不同架构修正Dockerfile
情况一:ARM架构机器(如树莓派)
PocketMine提供了专门的ARM架构二进制包,你需要修改ARG POCKETMINE_BINARY的地址,换成对应ARM版本的Jenkins构建链接:
- ARM 32位(armv7l):使用PHP-7.2-Linux-ARM32的构建产物
- ARM 64位(aarch64):使用PHP-7.2-Linux-ARM64的构建产物
修改后的Dockerfile片段示例:
# 替换为ARM64版本的下载链接 ARG POCKETMINE_BINARY=https://jenkins.pmmp.io/job/PHP-7.2-Linux-ARM64/lastSuccessfulBuild/artifact/*zip*/archive.zip
情况二:32位x86机器(i686)
需要替换为32位x86版本的PocketMine二进制包链接,确保和你的系统架构匹配。
情况三:跨架构构建镜像
如果你需要在非x86机器上构建x86架构的镜像(比如在ARM机器上构建给x86服务器用的镜像),需要启用Docker的buildx跨架构构建功能:
- 安装并启用buildx:
docker buildx install
- 创建跨架构构建实例:
docker buildx create --use --name pmmp-builder
- 构建时指定目标架构:
docker buildx build --platform linux/amd64 -t your-pmmp-image:latest .
3. 额外检查:确保启动脚本权限正确
有时候即使架构匹配,如果启动脚本没有执行权限,也可能触发类似错误。可以在Dockerfile中添加以下命令,确保启动脚本有权限运行:
# 假设解压后的启动脚本是start.sh,添加执行权限 RUN chmod +x ./start.sh
内容的提问来源于stack exchange,提问作者user7885981
相关产品推荐
相关产品推荐

