docker下安装php的imagick拓展
1.刚开始是这么安装的
RUN apt-get install -y \
libxslt1-dev \
imagick \
&& docker-php-ext-install xsl \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install imagick
2.这个写法分析
这个写法的问题在于:
docker-php-ext-install imagick 是无效的,因为 imagick 并不是 PHP 自带的扩展,而是一个通过 PECL 安装的扩展。 docker-php-ext-install 只能安装 PHP 官方内置的扩展(比如 xsl、bcmath、pdo_mysql 等)。
正确写法应该是
(基于 Debian 系的官方 PHP 镜像)
RUN apt-get update && apt-get install -y \
libxslt1-dev \
libmagickwand-dev --no-install-recommends \
&& docker-php-ext-install xsl \
&& docker-php-ext-install bcmath \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& rm -rf /var/lib/apt/lists/*
关键点
- 系统库安装
libmagickwand-dev是 Imagick 必需的头文件和库。- 不要直接装
imagick这个 apt 包,因为那是系统的 CLI 工具或旧版扩展,不一定适配 PHP 版本。
- PECL 安装
pecl install imagick会从官方源下载编译 PHP Imagick 扩展。
- 启用扩展
docker-php-ext-enable imagick会在php.ini里注册它。
- 对于 PHP 自带的内置扩展,如果它需要依赖,就先 apt-get install 对应的系统库,然后 docker-php-ext-install xxx
3.apt-get install 和 docker-php-ext-install 关系
它们的关系其实可以这么理解:
1️⃣ 角色不同
apt-get install安装的是系统级软件包(包括编译 PHP 扩展时需要的头文件和库文件)。- 来源:Debian/Ubuntu 系统的 APT 软件仓库
- 作用:提供 PHP 扩展编译时的依赖环境(例如
.h头文件、.so动态库等)
docker-php-ext-install安装的是 PHP 自带的内置扩展(ext/目录里的源码),它会调用docker-php-source+docker-php-ext-configure+docker-php-ext-install的组合脚本去编译这些扩展。- 来源:PHP 官方 Docker 镜像自带的源码
- 作用:在已有的系统依赖支持下,把扩展编译成
.so并在 PHP 里启用
2️⃣ 依赖关系
很多内置扩展并不是“裸装”就能编译成功,它们会用到系统级的库。 这时:
apt-get install装好依赖docker-php-ext-install编译安装扩展
举个例子:
RUN apt-get update && apt-get install -y \
libxslt1-dev \
libzip-dev \
&& docker-php-ext-install xsl zip
流程是:
apt-get install libxslt1-dev libzip-dev→ 安装系统库和头文件docker-php-ext-install xsl zip→ 编译 xsl 和 zip 扩展(依赖上一步装的库)
3️⃣ 什么时候不需要 apt-get install
扩展完全不依赖系统库(例如
bcmath、mysqli):RUN docker-php-ext-install bcmath mysqli
4️⃣ 什么时候用不到 docker-php-ext-install
如果是 PECL 扩展(imagick、redis、xdebug 等),它们不在 PHP 内置源码里,需要用:
RUN apt-get install -y libmagickwand-dev \ && pecl install imagick \ && docker-php-ext-enable imagick这里就不走
docker-php-ext-install了。
✅ 总结一句: apt-get install 是“买原材料”,docker-php-ext-install 是“用这些材料把 PHP 扩展做出来并装进 PHP 里”。 没有材料就做不出来,有材料但不去做,PHP 里也不会有这个扩展。
4.上面的配置好了,但是实际运行中会有如下报错
> [php 2/11] RUN apt-get update && apt-get install -y libxslt1-dev libmagickwand-dev --no-install-recommends && docker-php-ext-install xsl && docker-php-ext-install bcmath && pecl install imagick && docker-php-ext-enable imagick:
0.524 Ign:1 http://deb.debian.org/debian buster InRelease
0.589 Ign:2 http://deb.debian.org/debian-security buster/updates InRelease
0.661 Ign:3 http://deb.debian.org/debian buster-updates InRelease
0.724 Err:4 http://deb.debian.org/debian buster Release
0.724 404 Not Found [IP: 151.101.90.132 80]
0.787 Err:5 http://deb.debian.org/debian-security buster/updates Release
0.787 404 Not Found [IP: 151.101.90.132 80]
0.852 Err:6 http://deb.debian.org/debian buster-updates Release
0.852 404 Not Found [IP: 151.101.90.132 80]
0.860 Reading package lists...
1.425 E: The repository 'http://deb.debian.org/debian buster Release' no longer has a Release file.
1.425 E: The repository 'http://deb.debian.org/debian-security buster/updates Release' no longer has a Release file.
1.425 E: The repository 'http://deb.debian.org/debian buster-updates Release' no longer has a Release file.
------
failed to solve: process "/bin/sh -c apt-get update && apt-get install -y libxslt1-dev libmagickwand-dev --no-install-recommends && docker-php-ext-install xsl && docker-php-ext-install bcmath && pecl install imagick && docker-php-ext-enable imagick" did not complete successfully: exit code: 100
- 出现问题原因分析
- 和imagick 安装无关,根本原因是你的 PHP Docker 镜像基于 Debian buster,而 buster 已经 停止维护(EOL), 官方的 APT 仓库被移到了归档站,所以 apt-get update 会直接 404。
- 对于我这里的原因是: 我使用了自建的php镜像源,但是这个镜像里对于php景象的依赖是Debian buster, 所以现在有如下解决方案
- 1.改成归档源
RUN sed -i 's|deb.debian.org|archive.debian.org|g' /etc/apt/sources.list \ && sed -i '/security.debian.org/d' /etc/apt/sources.list \ && apt-get update \ && apt-get install -y \ libxslt1-dev \ libmagickwand-dev --no-install-recommends \ && docker-php-ext-install xsl \ && docker-php-ext-install bcmath \ && pecl install imagick \ && docker-php-ext-enable imagick \ && rm -rf /var/lib/apt/lists/*部分配置分析:sed -i 's|deb.debian.org|archive.debian.org|g' /etc/apt/sources.list sed -i '/security.debian.org/d' /etc/apt/sources.list apt-get update这三条命令的作用是修改 Debian 系统的 APT 软件源配置,让系统从归档(archive)服务器下载旧版本的软件包,解决官方源因为版本停止维护而导致的 404 错误。具体解释如下:sed -i 's|deb.debian.org|archive.debian.org|g' /etc/apt/sources.list
sed 是文本替换命令,-i 表示直接修改文件。 作用:把 /etc/apt/sources.list 文件中所有 deb.debian.org 的字符串替换成 archive.debian.org。 为什么要替换? deb.debian.org 是 Debian 正常的软件仓库地址,但对于停止维护的旧版本,它会被移除包,访问会 404。 archive.debian.org 是 Debian 的归档仓库,保留了旧版本的完整包。sed -i '/security.debian.org/d' /etc/apt/sources.list作用:删除 /etc/apt/sources.list 文件中包含 security.debian.org 的所有行。 为什么要删除? Debian 的安全更新源 security.debian.org 对旧版本(比如 buster)已经停止服务,访问会 404。 删除后防止 apt-get update 报错。apt-get update执行更新软件包索引,重新加载修改后的源列表。 这一步能成功,说明之前的替换和删除操作正确,APT 能够从归档服务器正常拉取软件包索引。
- 2.从镜像源头升级
如果能改这个私有镜像的构建方式,建议让它基于 php:8.3-fpm-bullseye 或 php:8.3-fpm-bookworm, 这样 apt 源是活的,不需要 archive 站。这个是最好的方式,这样所有使用这个自定义源的都可以生效
- 1.改成归档源
