Docker-Php-7.4-Alpine镜像无法载入zip扩展的问题

起因

今天我们有同事反映,部门的php基础镜像php-7.4-alpine无法使用ZipArchive方法。 报错:

1
Class 'ZipArchive' not found

相同的代码在php-7.2的容器是可以正常运行的。

现象

根据他提供的信息,去查找问题。

  1. 进入镜像:
1
docker run --rm -ti 165b4c0082b2 sh
  1. 查看扩展加载情况
1
php -m |grep zip

不存在zip扩展。 这就很奇怪了。 找到php.ini

1
vi /usr/local/etc/php/conf.d/docker-php-ext-zip.ini

是开启了zip扩展的。

  1. 查看dockerfile文件
1
2
3
4
5
6
7
8
9
RUN  set -xe; \
        \
        apk add --no-cache --virtual .build-deps \
            libzip-dev \
            libxml2-dev \
        ;\
        docker-php-ext-configure zip; \
        docker-php-ext-install -j$(nproc) zip; \
        apk del .build-deps

解决办法

通过google查找发现问题

php7.4编译参数--enable-zip变成了--with-zip,也就是说,zip扩展需要动态加载,不再是直接编译到php的可执行程序中。那么就需要依赖于libzip-dev.

以前的dockerfile安装了 libzip-dev依赖是在--virtual中,编译完以后会把依赖清除。导致zip依赖不能载入。

换一种写法:

1
2
3
4
5
6
7
8
9
RUN  set -xe; \
        \
        apk add libzip-dev; \
        apk add --no-cache --virtual .build-deps \
            libxml2-dev \
        ;\
        docker-php-ext-configure zip; \
        docker-php-ext-install -j$(nproc) zip; \
        apk del .build-deps

看懂了吗?

apk add libzip-dev;这个是直接加载到镜像中,不会被删除哦。

搞定!

0%