Docker部署WordPress时extensions/config卷为空问题求助
问题分析与解决方案
核心问题原因
Docker的**绑定挂载(主机目录挂载)**特性导致:当你把主机上的空目录挂载到容器内已有内容的路径时,容器内的路径会被主机空目录覆盖,变成空状态。而/var/www/html和/var/lib/mysql能正常被填充,是因为WordPress和MySQL镜像的启动脚本会在容器初始化时自动向这些路径写入初始化内容;但/usr/local/lib/php/extensions和/usr/local/etc/php/conf.d这两个路径,镜像本身有内容,但启动脚本不会主动重新生成或复制内容到挂载目录。
另外你在volumes区块声明了命名卷,但实际用的是主机目录挂载(./xxx:/path),所以这些命名卷定义并未生效。
解决方案1:手动复制容器内容到主机目录
临时移除compose.yaml中
extensions和config的挂载配置,启动容器:# 临时修改后的wordpress服务volumes部分 volumes: - ./wordpress:/var/www/html # 注释掉以下两行 # - ./extensions:/usr/local/lib/php/extensions # - ./config:/usr/local/etc/php/conf.d执行启动命令:
docker-compose up -d用
docker cp命令把容器内的对应目录内容复制到主机:# 复制PHP扩展目录内容 docker cp artanetwork_wp:/usr/local/lib/php/extensions ./extensions # 复制PHP配置目录内容 docker cp artanetwork_wp:/usr/local/etc/php/conf.d ./config停止容器,恢复原来的挂载配置,重新启动:
docker-compose down # 还原compose.yaml里的挂载配置 docker-compose up -d此时主机目录已有内容,挂载后不会清空容器内的路径。
解决方案2:使用命名卷替代主机目录挂载(推荐)
命名卷在第一次使用时,会自动从镜像中复制对应路径的内容到卷里,不会出现覆盖清空的问题。修改compose.yaml的wordpress服务volumes部分:
services: wordpress: # 其他配置保持不变 volumes: - ./wordpress:/var/www/html # 改用命名卷,对应volumes区块的定义 - extensions:/usr/local/lib/php/extensions - config:/usr/local/etc/php/conf.d # 其他配置保持不变 volumes: wordpress: extensions: config: mysql:
修改后启动容器,命名卷会自动初始化容器内的初始内容,后续修改会持久化到卷中。
内容的提问来源于stack exchange,提问作者Omid Shojaee
相关产品推荐
相关产品推荐

