直接改容器内php.ini无效,因php仅启动时读取一次且重启后覆盖;必须通过挂载custom.ini到/conf.d/目录或构建镜像固化配置,确保持久生效。

直接改容器里的 php.ini 文件,改完就丢——容器一重启或重建,配置全回滚。真要持久生效,必须绕过“进容器改文件”这个陷阱,走挂载或构建两条正路。
为什么不能用 docker exec 直接改 php.ini
PHP 容器启动时只读一次 php.ini,后续修改不触发重载;即使你用 vim 改了 /usr/local/etc/php/php.ini,只要容器没重启,新配置压根不生效。更关键的是:容器删了,改的文件就没了。官方镜像里 php.ini 是只读层的一部分,运行时写入属于临时覆盖,不进镜像层。
常见错误现象:
- 进容器改完
php.ini,php -i | grep upload_max_filesize还是旧值 - 重启容器后,配置又变回默认值
-
docker commit打包后新镜像仍不加载修改(因为 PHP 启动逻辑不扫描已加载过的路径)
挂载自定义配置到 /usr/local/etc/php/conf.d/
这是开发和测试环境最稳妥的做法。PHP 启动时会自动按字母序加载 /usr/local/etc/php/conf.d/ 下所有 .ini 文件,优先级高于主 php.ini,且支持覆盖已有指令。
实操建议:
- 在宿主机建一个
custom.ini,只写你要改的项,比如:upload_max_filesize = 64M post_max_size = 64M opcache.enable = 1
- 用
volumes挂载到容器内该目录,路径必须是/usr/local/etc/php/conf.d/custom.ini(不是php.ini主文件位置) - 在
docker-compose.yml中写成:volumes: - ./custom.ini:/usr/local/etc/php/conf.d/custom.ini
- 别挂载整个
conf.d/目录——会清空容器自带的默认配置(如docker-php-ext-*生成的 ini)
用 Dockerfile 构建带固化配置的镜像
生产环境必须走这条路。挂载方式在 CI/CD 或多副本部署中不可控,而构建镜像能确保配置随镜像版本固化、可审计、可复现。
实操建议:
- 基于官方
php:8.2-fpm写 Dockerfile,用COPY把你的php.ini或conf.d/*.ini放进去 - 不要用
RUN echo "..." >> /usr/local/etc/php/php.ini—— 容易破坏文件编码或权限,且无法覆盖已存在的同名指令 - 推荐做法:
COPY php.ini /usr/local/etc/php/php.ini # 或更安全地: COPY custom.ini /usr/local/etc/php/conf.d/custom.ini
- 构建后用
docker run --rm your-php-image php -i | grep max_execution_time验证
验证配置是否真正生效的三个硬检查点
光看 php -i 输出还不够,PHP-FPM 和 Web 服务可能各自加载不同配置。
必须查清:
-
php -i | grep "Loaded Configuration File"—— 确认主php.ini路径是否是你挂载/构建的目标路径 -
php -i | grep "Scan this dir for additional .ini files"—— 确认conf.d目录是否被扫描,且你的文件名在字母序中未被跳过(比如叫00-custom.ini更稳) - 在 Web 环境下访问
<?php phpinfo(); ?>页面,对比 CLI 和 FPM 的输出是否一致——很多问题出在 FPM 进程没 reload,得kill -USR2或重启 PHP-FPM 容器
最容易被忽略的是:挂载的 .ini 文件权限为 600 且属主是 root,但 PHP-FPM worker 是 www-data 用户,会导致文件被跳过加载——务必加 chown root:root 和 chmod 644 宿主机文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











