【问题标题】:can't install intl in php:7.4-alpine无法在 php:7.4-alpine 中安装 intl
【发布时间】:2021-06-02 22:09:32
【问题描述】:

我刚刚开始使用 Docker,我正在尝试使用 php:7.4-alpine 映像运行 ZF2 项目,这是我目前拥有的 Dockerfile

FROM php:7.4-alpine

ENV APACHE_DOCUMENT_ROOT /var/www/app/public

COPY ./src /var/www/app

RUN apk add --no-cache \
    apache2 \
    php-apache2 \
    zlib-dev \
    icu-dev \
    libpng-dev \
    composer

RUN docker-php-ext-install \
    gd \ 
    intl \
    mysqli \
    pdo_mysql \
    iconv

RUN chmod -R 775 /var/www/app
RUN chown -R www-data:www-data /var/www/app
RUN cd /var/www/app && composer install

COPY ./apache /etc/apache2

CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

(我使用多个 RUN 只是为了在构建过程中加快速度,我将在生产环境中更改它)

问题是,我只得到一个 500 错误,日志显示这个

PHP Fatal error:  Uncaught Error: Class 'Locale' not found in /var/www/...

根据我搜索的结果,这与 intl 扩展名有关,如您所见,我将它安装在 Dockerfile 中,如果我在容器的 shell 中运行 php -m,则 intl 就在那里,但是,在我设置的一个简单的 ext.php 文件中,包含以下内容:

<?php
    var_dump(get_loaded_extensions());
?>

输出是这样的:

array(18) {
  [0]=>
  string(4) "Core"
  [1]=>
  string(4) "date"
  [2]=>
  string(6) "libxml"
  [3]=>
  string(4) "pcre"
  [4]=>
  string(4) "zlib"
  [5]=>
  string(6) "filter"
  [6]=>
  string(4) "hash"
  [7]=>
  string(10) "Reflection"
  [8]=>
  string(3) "SPL"
  [9]=>
  string(8) "standard"
  [10]=>
  string(14) "apache2handler"
  [11]=>
  string(4) "curl"
  [12]=>
  string(5) "iconv"
  [13]=>
  string(4) "json"
  [14]=>
  string(8) "mbstring"
  [15]=>
  string(7) "openssl"
  [16]=>
  string(3) "zip"
  [17]=>
  string(4) "Phar"
}

如你所见,这里不存在 intl

我在使用 mlocati/docker-php-extension-installer 之前对 intl 没有任何问题,但我在使用它时遇到了 iconv 问题,所以我回到了“vanilla”docker-php-ext-install

我在安装之前尝试过使用docker-php-ext-configure intl,在安装之后使用docker-php-ext enable intl,没有任何改变。

【问题讨论】:

  • 配置似乎是可选的[?],但启用绝对是必需的。
  • @Sammitch 我尝试使用docker-php-ext-enable intl,没有任何改变

标签: php docker alpine


【解决方案1】:

让我们开始吧:

$ docker run --rm -it php:7.4-alpine -r 'var_dump($l = new Locale("en_CA"));'

Fatal error: Uncaught Error: Class 'Locale' not found in Command line code:1
Stack trace:
#0 {main}
  thrown in Command line code on line 1

是的,那是曲目。那么:

FROM php:7.4-alpine
RUN apk add icu-dev
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
RUN docker-php-ext-enable intl

和:

$ docker build -t php:intl-test ./

终于:

$ docker run --rm -it php:intl-test -r 'var_dump($l = new Locale("en_CA"));'
object(Locale)#1 (0) {
}

所以要么它工作正常,要么你有一个完全不同的问题

【讨论】:

  • 这个。正是这个。
【解决方案2】:

这是我从docker-php-ext-install intl 得到的输出:

configure: error: Package requirements (icu-uc >= 50.1 icu-io icu-i18n) were not met:

Package 'icu-uc', required by 'virtual:world', not found
Package 'icu-io', required by 'virtual:world', not found
Package 'icu-i18n', required by 'virtual:world', not found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables ICU_CFLAGS
and ICU_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

最简单的解决方案是将icu-dev 添加到已安装的包中。

已更新以回答原始问题:
docker-php-ext-install 似乎不能很好地处理转义的换行符。我现在没有时间研究为什么会这样。将所有扩展放在一行上应该可以。

如果您对我对这些类型问题的调试过程感兴趣,我会运行 docker run --rm -ti --entrypoint sh php:7.4-alpine 之类的内容,然后直接运行命令。

【讨论】:

  • 我已更新,希望能正确回答您的问题。
  • 不,这并没有解决它,我设法通过在 apk add 命令中添加 php-intl 来“修复” intl 部分,但后来我开始遇到与 PDO 相关的问题,肯定有一些严重的问题我的docker-php-ext-install 有问题,这不是转义换行符
  • 我不知道 - 注释掉对我没有的文件和文件夹的操作,图像构建 find 并且 intl 在那里。您的 composer.json 是否可能导致问题?
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2018-06-16
  • 2018-11-14
  • 2020-12-17
  • 2019-02-23
  • 2019-06-09
  • 1970-01-01
相关资源
最近更新 更多