Alpine镜像Docker构建PHP7.4安装imagick报Makefile:192 Error127求助
问题根因
你遇到的make: /bin/sh: Operation not permitted错误和本地宿主机的gcc、build-essential、PATH配置完全无关,Docker容器是隔离运行环境,构建过程依赖的是容器内部的Alpine系统环境,你本地的Ubuntu环境配置不会影响容器内部操作。
该错误的实际原因是:你使用的php:7.4-fpm-alpine镜像底层基于Alpine 3.14及以上版本,该版本使用了新的系统调用,而你宿主机Ubuntu 20.04的默认libseccomp版本、Docker版本较低,seccomp安全模块拦截了Alpine 3.14+需要的系统调用,导致容器内执行shell操作时报权限错误。
解决方案
方案一(最快生效,无需修改宿主机配置)
直接指定使用Alpine 3.13版本的PHP基础镜像,修改Dockerfile的基础镜像语句即可:
# 把原来的 FROM php:7.4-fpm-alpine 替换为下面的内容 FROM php:7.4-fpm-alpine3.13
方案二(适配高版本Alpine镜像,修改宿主机配置)
如果需要使用更高版本的Alpine基础镜像,升级宿主机的相关组件即可:
- 升级Docker到官方最新稳定版
- 升级libseccomp依赖包:
sudo apt update && sudo apt install -y libseccomp2
方案三(临时测试用,不建议生产环境使用)
构建时临时关闭seccomp安全限制,构建命令增加参数:
# 原生docker build 命令 docker build --security-opt seccomp=unconfined . # docker-compose 构建的话,在对应服务的build配置下添加参数 # build: # context: . # security_opt: # - seccomp:unconfined
额外注意事项
- 安装imagick扩展前,需要先在Alpine容器内安装对应的依赖包,你需要在
PERMANENT_DEPS中添加imagemagick,在.build-deps中添加imagemagick-dev,否则pecl安装时会找不到头文件导致构建失败。 - 你之前执行
apt show报错是因为命令里的横杠用了中文全角字符,不是build-essential本身的问题。 - 你之前在
~/.bashrc中添加的build-essential相关PATH配置属于无效操作,可以删除回滚。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

