Docker构建PHP镜像docker-php-ext-install返回非零码1如何排查解决
故障原因
你当前Dockerfile存在多个直接触发构建失败的问题:
- 使用的基础镜像
php:7.4-fpm基于Debian系统,后续步骤里写的apk是Alpine发行版专属的包管理命令,Debian环境下不存在该命令,执行直接报错 - 安装PHP的
zip扩展前,没有提前安装对应的系统依赖libzip-dev;且在安装完第一波系统依赖后立刻清空了apt软件源缓存,后续即使要补装依赖也无法读取软件包列表 - 重复3次执行
zip扩展安装操作,逻辑冗余 - PHP7.4版本下编译
gd扩展已经废弃了旧的--with-freetype-dir/--with-jpeg-dir类目录指定参数,沿用旧参数会触发编译错误 - 扩展安装顺序错误:在zip依赖未安装、配置未完成的情况下,就先执行了包含zip的扩展安装命令
docker-php-ext-install pdo_mysql mbstring zip exif pcntl,也就是报错指向的那行命令,这一步会直接因为zip扩展编译失败中断整个构建流程。
修复方案
直接替换为修正后的Dockerfile内容:
FROM php:7.4-fpm # 复制composer配置文件 COPY composer.lock composer.json /var/www/ # 设置工作目录 WORKDIR /var/www # 安装系统依赖,补全zip扩展需要的libzip-dev包 RUN apt-get update && apt-get install -y \ build-essential \ mariadb-client \ libpng-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ libzip-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ vim \ unzip \ git \ nano \ curl # 适配PHP7.4的gd扩展配置参数,一次性编译安装所有需要的PHP扩展 RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) pdo_mysql mbstring zip exif pcntl gd # 所有扩展安装完成后再清理apt缓存 RUN apt-get clean && rm -rf /var/lib/apt/lists/* # 安装composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 创建Laravel应用运行用户 RUN groupadd -g 1000 www RUN useradd -u 1000 -ms /bin/bash -g www www # 复制项目文件 COPY . /var/www # 修正项目目录权限 COPY --chown=www:www . /var/www # 切换到非root用户运行 USER www # 暴露9000端口启动php-fpm EXPOSE 9000 CMD ["php-fpm"]
后续操作
- 替换完Dockerfile后,执行
docker compose build --no-cache app命令,禁用缓存重新构建app服务,避免之前失败的构建层缓存干扰结果 - 构建成功后执行
docker compose up -d即可正常启动编排服务
内容的提问来源于stack exchange,提问作者Jeremiah O.E
相关产品推荐
相关产品推荐

