Docker Compose service挂载volume未实时同步宿主机文件变更问题排查
问题根因
你遇到的文件变更无法实时同步到容器的问题,和Docker挂载配置无关,是PHP运行缓存、框架缓存配置导致的,具体解决方法如下:
1. 修正PHP Opcache配置
你的Dockerfile中默认加载了生产环境的api-platform.prod.ini配置,生产环境下Opcache默认关闭了PHP文件变更校验,只会在服务启动时读取一次文件内容,因此修改宿主机代码后不会实时生效。
解决方案:
在docker-compose.yml的php服务的volumes节点下新增配置,用开发环境的ini覆盖生产配置:
volumes: - ./:/srv/api - ./docker/php/conf.d/api-platform.dev.ini:/usr/local/etc/php/conf.d/api-platform.ini
同时确保api-platform.dev.ini中存在以下Opcache开发配置:
opcache.enable=1 opcache.validate_timestamps=1 opcache.revalidate_freq=0 opcache.max_accelerated_files=10000 opcache.memory_consumption=128
2. 切换Symfony运行环境为开发模式
你的Dockerfile中默认设置了APP_ENV=prod,生产环境下Symfony会将路由、配置、模板等内容预编译为缓存文件,不会自动检测代码变更重新编译。
解决方案:
在docker-compose.yml的php服务下新增environment节点,切换为开发环境:
php: build: context: . env_file: - .env environment: - APP_ENV=dev ports: - "9000:9000" volumes: - ./:/srv/api - ./docker/php/conf.d/api-platform.dev.ini:/usr/local/etc/php/conf.d/api-platform.ini
额外优化建议
你当前docker-compose.yml中mysql服务的卷配置.data:/var/lib/mysql缺少相对路径标识,修改为./.data:/var/lib/mysql可保证数据库数据存储在当前项目目录下,方便管理。
修改完成后执行docker-compose up -d --build重启服务即可生效,后续修改宿主机代码就能实时同步到容器中。
内容的提问来源于stack exchange,提问作者KodeFor.Me
相关产品推荐
相关产品推荐

