指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
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/*

关键点
  1. 系统库安装
  • libmagickwand-dev 是 Imagick 必需的头文件和库。
  • 不要直接装 imagick 这个 apt 包,因为那是系统的 CLI 工具或旧版扩展,不一定适配 PHP 版本。
  1. PECL 安装
  • pecl install imagick 会从官方源下载编译 PHP Imagick 扩展。
  1. 启用扩展
  • docker-php-ext-enable imagick 会在 php.ini 里注册它。
  1. 对于 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️⃣ 依赖关系

很多内置扩展并不是“裸装”就能编译成功,它们会用到系统级的库。 这时:

  1. apt-get install 装好依赖
  2. 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 错误。具体解释如下:
        1. 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 的归档仓库,保留了旧版本的完整包。
        
        1. 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 报错。
          
        2. apt-get update
          执行更新软件包索引,重新加载修改后的源列表。
          这一步能成功,说明之前的替换和删除操作正确,APT 能够从归档服务器正常拉取软件包索引。
          
      • 2.从镜像源头升级

        如果能改这个私有镜像的构建方式,建议让它基于 php:8.3-fpm-bullseye 或 php:8.3-fpm-bookworm, 这样 apt 源是活的,不需要 archive 站。这个是最好的方式,这样所有使用这个自定义源的都可以生效