Dockerfile - RUN apt-get install -y php5-MODULES 不再工作 -'没有安装候选者'。如何解决?



我有一个图像 php5.6+apache,我从 3 周前开始使用它,当我构建它时,通过一个 Dockerfile。

我使用此基本映像从中启动映像。 一切都运行良好,直到今天我不得不更改 php.ini 中的一些变量。

现在,当我尝试再次构建映像时,出现此错误:

Step 5/173 : RUN apt-get install -y php5-common
---> Running in 8114082e9931
Reading package lists...
Building dependency tree...
Reading state information...
Package php5-common is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'php5-common' has no installation candidate
The command '/bin/sh -c apt-get install -y php5-common' returned a non-zero code: 100

似乎我尝试安装的每个 php 模块都在发生这种情况。

以下是 Dockerfile 的一部分:

FROM php:5-apache
## Update apt-get
RUN apt-get update
RUN php -m    
RUN php -v

RUN apt-get install -y php5-common
RUN apt-get install -y php-calendar
RUN docker-php-ext-install bcmath
RUN apt-get install -y php5-mhash
RUN apt-get install -y php5-intl
RUN cp /etc/php5/mods-available/intl.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/intl.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/intl.so
RUN apt-get install -y php5-mcrypt
RUN cp /etc/php5/mods-available/mcrypt.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/mcrypt.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/mcrypt.so
RUN apt-get install -y php5-redis
RUN cp /etc/php5/mods-available/redis.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/redis.so
RUN apt-get install -y php5-mysql
RUN cp /etc/php5/mods-available/mysql.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/mysql.so
RUN cp /etc/php5/mods-available/opcache.ini /usr/local/etc/php/conf.d
RUN apt-get install -y php5-gd
RUN cp /etc/php5/mods-available/gd.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/gd.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/gd.so
RUN apt-get install -y php5-gdcm
RUN cp /etc/php5/mods-available/gdcm.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/gdcm.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/gdcm.so
RUN apt-get install -y php5-vtkgdcm
RUN cp /etc/php5/mods-available/vtkgdcm.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/vtkgdcm.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/vtkgdcm.so
RUN apt-get install -y php5-ldap
RUN cp /etc/php5/mods-available/ldap.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/ldap.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/ldap.so
RUN apt-get install -y php5-xsl
RUN cp /etc/php5/mods-available/xsl.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/xsl.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/xsl.so
RUN apt-get install -y php5-tidy
RUN cp /etc/php5/mods-available/tidy.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/tidy.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/tidy.so
RUN apt-get install -y php5-xmlrpc
RUN cp /etc/php5/mods-available/xmlrpc.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/xmlrpc.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/xmlrpc.so
RUN apt-get install -y php5-pgsql
RUN cp /etc/php5/mods-available/pgsql.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/pgsql.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/pgsql.so
RUN cp /etc/php5/mods-available/mysqli.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/mysqli.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/mysqli.so
RUN cp /etc/php5/mods-available/pdo.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/pdo.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/pdo.so
RUN cp /etc/php5/mods-available/pdo_mysql.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/pdo_mysql.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so
RUN cp /etc/php5/mods-available/pdo_pgsql.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/pdo_pgsql.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/pdo_pgsql.so
RUN cp /etc/php5/mods-available/readline.ini /usr/local/etc/php/conf.d && ln -s /usr/lib/php5/20131226/readline.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226/readline.so
#COPYING__php.ini
RUN cp /etc/php5/cli/php.ini /usr/local/etc/php/
RUN ls -l /usr/local/etc/

## Setting up php.ini varaibles
RUN grep '^post_max_size' /usr/local/etc/php/php.ini
RUN sed -i 's,^post_max_size =.*$,post_max_size = 2048M,' /usr/local/etc/php/php.ini
RUN grep '^post_max_size' /usr/local/etc/php/php.ini
RUN grep '^upload_max_filesize' /usr/local/etc/php/php.ini
RUN sed -i 's,^upload_max_filesize =.*$,upload_max_filesize = 2048M,' /usr/local/etc/php/php.ini
RUN grep '^upload_max_filesize' /usr/local/etc/php/php.ini
...

基本上has no installation candidate3 周前工作的所有模块的错误。

我该如何解决这个问题?

更新

要关注问题,请参阅此帖子

官方 PHP 容器映像附带了帮助程序,使这更容易。这些示例直接来自 Docker 上的 PHP 存储库。

要安装核心扩展mcyrpt您需要将以下内容添加到您的Dockerfile

RUN docker-php-ext-install -j$(nproc) mcrypt

某些扩展要求系统上存在库(因为在生成容器时编译扩展)。请注意,在此示例中,所有命令都串在一起,您可以将每个命令作为单独的RUN发出。

RUN apt-get update && apt-get install -y libfreetype6-dev 
libjpeg62-turbo-dev 
libmcrypt-dev 
libpng-dev
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
&& docker-php-ext-install -j$(nproc) gd

对于 PECL 扩展(如redismemcached),您将让pecl install处理安装,然后使用docker-php-ext-enable添加相应的.ini文件。与上面的gd示例不同,某些 PECL 扩展有自己的依赖项,因此在安装之前应使用apt-get install -y ...添加这些依赖项。

RUN pecl install redis-3.1.0 && docker-php-ext-enable redis

将它们串在一起,添加gdredismcrypt可能看起来像这样。

FROM php:5-apache 
RUN apt-get update && apt-get install -y libfreetype6-dev 
libjpeg62-turbo-dev 
libmcrypt-dev 
libpng-dev
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
&& docker-php-ext-install -j$(nproc) gd
RUN docker-php-ext-install -j$(nproc) mcrypt
RUN pecl install redis-3.1.0 && docker-php-ext-enable redis
RUN php -m

如果您查看提供链接的Dockerfile,它会包含以下行:

# prevent Debian's PHP packages from being installed
# https://github.com/docker-library/php/pull/542
RUN set -eux; 
{ 
echo 'Package: php*'; 
echo 'Pin: release *'; 
echo 'Pin-Priority: -1'; 
} > /etc/apt/preferences.d/no-debian-php

-1对 PHP 软件包Pin-Priority的偏好是告诉系统不要安装这些软件包。 拉取请求解释了为什么 https://github.com/docker-library/php/pull/542。

要解决您的问题,您必须使用他们使用内置docker-php-ext-install命令安装PHP包的方式。以下是他们官方页面 https://hub.docker.com/_/php/中的示例:

FROM php:5-apache
RUN apt-get update && apt-get install -y 
libfreetype6-dev 
libjpeg62-turbo-dev 
libmcrypt-dev 
libpng-dev 
&& docker-php-ext-install -j$(nproc) iconv mcrypt 
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
&& docker-php-ext-install -j$(nproc) gd

祝你好运。

相关内容

最新更新