php:7.4-alpine镜像安装intl扩展后web端不生效问题求助
问题根因
你的环境中存在两套完全独立的PHP实例,是导致扩展不一致的核心原因:
- 基础镜像
php:7.4-alpine自带官方编译的PHP,docker-php-ext-install是官方镜像专属的扩展安装工具,安装的扩展仅对这套PHP生效,因此你进入容器执行php -m(默认调用官方PHP)可以看到intl扩展 - 你通过apk安装的
php-apache2是Alpine软件源自带的PHP版本,和官方PHP相互独立,Apache服务加载的是这套PHP,自然没有你后续安装的intl、gd等扩展
推荐解决方案
直接使用官方预集成Apache的Alpine镜像,从根源避免多PHP版本冲突,修改后的Dockerfile如下:
FROM php:7.4-apache-alpine ENV APACHE_DOCUMENT_ROOT /var/www/app/public # 解决Alpine系统原生iconv扩展编码处理异常问题 ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so RUN apk add --no-cache \ zlib-dev \ icu-dev \ libpng-dev \ gnu-libiconv \ composer RUN docker-php-ext-install \ gd \ intl \ mysqli \ pdo_mysql \ iconv COPY ./src /var/www/app 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 # 更新Apache默认站点根目录配置 RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT%/*}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf CMD ["apache2-foreground"]
方案说明
- 基础镜像
php:7.4-apache-alpine已预配置Apache与mod_php,无需额外安装apache2、php-apache2,不存在多PHP版本冲突问题 docker-php-ext-install安装的扩展会直接作用于Apache加载的PHP实例,web访问可正常识别intl等所有安装的扩展- 新增的gnu-libiconv兼容配置可解决Alpine下iconv扩展的编码异常问题,无需再使用第三方扩展安装工具
- 保留多RUN结构符合你本地调试提升构建速度的需求,生产环境可自行合并优化
备选方案(保留原基础镜像)
如果不希望更换基础镜像,放弃使用docker-php-ext-install安装扩展,改为直接安装Alpine源对应的PHP扩展包即可:
# 原基础镜像不变 FROM php:7.4-alpine ENV APACHE_DOCUMENT_ROOT /var/www/app/public COPY ./src /var/www/app # 直接安装Alpine源的PHP扩展,无需再用docker-php-ext-install RUN apk add --no-cache \ apache2 \ php-apache2 \ zlib-dev \ icu-dev \ libpng-dev \ php-gd \ php-intl \ php-mysqli \ php-pdo_mysql \ php-iconv \ composer 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"]
内容的提问来源于stack exchange,提问作者Levy Barbosa
相关产品推荐
相关产品推荐

