基于PHP+Apache的Dockerfile本地卷挂载不生效问题咨询
Docker挂载本地目录文件变更不生效解决方案
常见原因及对应处理方式
- OPcache缓存导致PHP文件变更不生效
官方php:7.3-apache镜像默认开启OPcache扩展,会将解析后的PHP脚本缓存到内存中,即使挂载目录的本地文件修改,Apache依然会读取缓存内容返回。
解决方法:在Dockerfile中新增配置关闭OPcache(仅开发环境使用,生产环境建议开启OPcache提升性能):
FROM php:7.3-apache # 关闭OPcache RUN echo "opcache.enable=0" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini \ && echo "opcache.enable_cli=0" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini EXPOSE 80/tcp
修改后重新构建镜像再启动容器即可。
- 挂载路径异常或跨文件系统通知失效
- 首先确认执行
docker run命令的当前工作目录为你项目的根目录,可执行docker inspect <运行的容器ID>查看Mounts字段,确认Source路径为你本地的项目目录、Destination为/var/www/html/,确认挂载操作成功。 - 如果你使用Windows+WSL2环境运行Docker,需要将项目文件存放在WSL2的Linux文件系统中,不要存放在Windows的
/mnt/c等挂载盘内,跨文件系统的挂载会丢失文件变更通知,导致容器感知不到文件修改。
- Apache静态文件缓存导致非PHP文件变更不生效
如果是HTML/CSS/JS等静态文件修改不生效,是Apache默认配置了静态资源缓存规则,可在项目根目录新增.htaccess文件关闭缓存(仅开发环境使用):
<IfModule mod_expires.c> ExpiresActive Off </IfModule> <IfModule mod_headers.c> Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </IfModule>
额外优化提示
开发环境使用本地目录挂载的场景下,Dockerfile中的COPY . /var/www/html指令完全不需要,容器启动时的挂载会直接覆盖镜像内的/var/www/html目录,保留COPY指令只会无意义增加镜像构建的时间,可直接删除。
内容的提问来源于stack exchange,提问作者Áron Pop Adorján
相关产品推荐
相关产品推荐

