Docker镜像构建使用PHP zip扩展会显示“bundled libzip is deprecated”警告

82

我有一个包含以下构建命令的 Dockerfile

#install some base extensions
RUN apt-get install -y \
        zlib1g-dev \
        zip \
  && docker-php-ext-install zip

我从构建输出中得到了这个警告:

警告:使用捆绑的libzip已不推荐使用并将被删除。
configure: 警告:某些功能,如加密和bzip2不可用。
configure: 警告:使用系统库和--with-libzip 是推荐的。

有什么正确的方法可以安装zip扩展而不出现这些警告?

我的完整Dockerfile如下:

FROM php:7.2-apache

RUN apt-get clean
RUN apt-get update

#install some basic tools
RUN apt-get install -y \
        git \
        tree \
        vim \
        wget \
        subversion

#install some base extensions
RUN apt-get install -y \
        zlib1g-dev \
        zip \
  && docker-php-ext-install zip

#setup composer
RUN curl -sS https://getcomposer.org/installer | php \
        && mv composer.phar /usr/local/bin/ \
        && ln -s /usr/local/bin/composer.phar /usr/local/bin/composer


WORKDIR /var/www/

尝试运行 apt-get install php7.0-zip - Vladimir
@Vladimir,我认为这是Docker,他们建议使用docker-php-ext-install。https://hub.docker.com/_/php/ - sakhunzai
8个回答

249

看起来PHP不再捆绑libzip。你需要安装它。你安装了zlib1g-dev,但应该安装libzip-dev。这将安装zlib1g-dev作为依赖项,并允许configure脚本检测到已安装libzip

对于PHP < 7.3,您还需要

docker-php-ext-configure zip --with-libzip

在执行安装之前使用

docker-php-ext-install zip

作为最后的警告提示。
简而言之:更改Dockerfile中相关部分为
对于PHP < 7.3
#install some base extensions
RUN apt-get install -y \
        libzip-dev \
        zip \
  && docker-php-ext-configure zip --with-libzip \
  && docker-php-ext-install zip

对于 PHP >= 7.3

#install some base extensions
RUN apt-get install -y \
        libzip-dev \
        zip \
  && docker-php-ext-install zip

我已经验证了预期的构建结果。

 


 

如果您没有使用DockerPHP基础镜像,那么事情可能会更加容易。例如,对于Alpine操作系统,以下Dockerfile将为您安装带有zip扩展的PHP 7。

FROM alpine:latest

RUN apk update && apk upgrade
RUN apk add php7 php7-zip composer

1
谢谢,这解决了我从7.1升级时遇到的问题。 - Brad
1
谢谢!很清楚。当您从7.3升级到7.4时,必须删除 docker-php-ext-configure zip --with-libzip - Player1
我正在使用php:8.1-apache,似乎还需要zlib1g-dev软件包。 - wilsontgh
我正在使用php:8.1-apache,似乎还需要zlib1g-dev软件包。 - undefined

22

如果你正使用7.4版本,以下方法适用:

FROM php:7.4-fpm-alpine

RUN apk add --no-cache zip libzip-dev
RUN docker-php-ext-configure zip
RUN docker-php-ext-install zip
RUN docker-php-ext-install pdo pdo_mysql 

2
这对我来说在使用7.4时有效。 - Usama Munir
请注意,fyi php:7.4-fpm-alpine存在严重的安全问题。详情请访问:https://hub.docker.com/layers/library/php/7.4.0-fpm-alpine/images/sha256-35565c5edd4dd676a7ea7d7b566eab08b2ee6474263f6cd384d4d29d4590a199 - Teymur Mardaliyer Lennon

11

显然,zip扩展需要在运行时(而不仅仅是构建时)安装libzip-dev包。我最初将apk add libzip-dev添加到一个虚拟包中,该包与gcc make postgresql-dev一起安装,但后来为了减小镜像大小而将其删除。

这样做可以:

RUN apk add openjdk11-jre-headless libzip-dev \ # libzip-dev not part of virtual package
  && apk add --no-cache --virtual \
     .build-deps autoconf g++ make postgresql-dev  \
  && docker-php-ext-configure zip \
  && docker-php-ext-install zip \
  && docker-php-ext-install pdo_pgsql bcmath \
  && pecl install redis-5.3.1 \
  && pecl install xdebug-beta \
  && docker-php-ext-enable redis opcache xdebug \
  && apk add libpq ca-certificates curl \
  && apk del .build-deps  \
  && rm -rf /tmp/* \
  && rm -rf /var/cache/apk/*

这样做是起作用的:

RUN apk add openjdk11-jre-headless \
  && apk add --no-cache --virtual \
     .build-deps autoconf g++ make postgresql-dev libzip-dev \ # libzip-dev part of virtual package
  && docker-php-ext-configure zip \
  && docker-php-ext-install zip \
  && docker-php-ext-install pdo_pgsql bcmath \
  && pecl install redis-5.3.1 \
  && pecl install xdebug-beta \
  && docker-php-ext-enable redis opcache xdebug \
  && apk add libpq ca-certificates curl \
  && apk del .build-deps  \
  && rm -rf /tmp/* \
  && rm -rf /var/cache/apk/*

我正在使用php7.4-fpm-alpine,这是唯一对我有效的东西。很好的发现! - Nathan
安装libzip-devlibzip,然后卸载libzip-dev也可以起作用。 - ahmadali shafiee
1
@ahmadalishafiee 我去年测试时的结论是,在构建lipzip后卸载libzip-dev会破坏库。 - Charlie
我可以确认,在运行时需要 libzip-dev - nmfzone

9

我使用 php:7.2-fpm-alpine 在 Docker 上建立了一个 PHP 容器。

FROM php:7.2-fpm-alpine

WORKDIR /var/www

RUN apk add --no-cache zip libzip-dev
RUN docker-php-ext-configure zip --with-libzip
RUN docker-php-ext-install zip
RUN docker-php-ext-install pdo pdo_mysql 

你可能想解释一下为什么这种方法与 OP 的不同/更好,并且为什么要安装 zip 作为额外的 docker-php-ext-install(这会创建一个额外的层)。 - Greg Bell
这个例子对我帮助很大,因为我也在使用alpine作为我的容器。谢谢! @GregBell 我同意运行多个RUN命令似乎效率不高 - Rizky Fakkel

6
为了构建一个php/apache容器,您只需要先安装libzip-dev库。至少使用docker镜像php:7.3-apache。
FROM php:7.3-apache
MAINTAINER XXX

RUN apt-get update
RUN apt-get install -y libzip-dev
RUN docker-php-ext-install zip

希望能帮上你的忙。

1
我使用php:7.4-fpm-alpine构建了一个PHP的dockerfile。
FROM php:7.4-fpm-alpine
    
    # Apk install
    RUN apk --no-cache update && apk --no-cache add bash git
    RUN apk add --no-cache zip libzip-dev

    RUN docker-php-ext-configure zip
    RUN docker-php-ext-install zip
    RUN docker-php-ext-install pdo pdo_mysql
    
    # Install composer
    RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && php composer-setup.php && php -r "unlink('composer-setup.php');" && mv composer.phar /usr/local/bin/composer
    
    # Symfony CLI
    RUN wget https://get.symfony.com/cli/installer -O - | bash && mv /root/.symfony/bin/symfony /usr/local/bin/symfony
    
    WORKDIR /var/www/html

1
FROM php:8.1-fpm-alpine

# Install persistent dependencies
RUN set -eux; \
    apk add --no-cache --update \
    bash \
    imagemagick \
    ghostscript \
    zip \
    unzip \
    nano \
    libzip-dev \
    libgomp


# Install the PHP extensions
RUN set -ex; \
    apk add --no-cache --virtual .build-deps \
        ${PHPIZE_DEPS} \
        freetype-dev \
        icu-dev \
        imagemagick-dev \
        libjpeg-turbo-dev \
        libpng-dev \
        libwebp-dev \
        zlib-dev \
    ; \

-1

这个对我有用:

RUN docker-php-ext-configure zip --with-libzip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接