Docker容器内/var/www/example目录如何反向同步到宿主机本地./www目录
问题核心原因
Docker 绑定挂载(bind mount)的默认逻辑是宿主机目录内容完全覆盖容器内对应路径的内容,你当前的配置是空的宿主机./www目录覆盖了镜像内已生成的/var/www/example内容,属于设计层面的默认行为
解决方案
方案1:容器启动自动同步初始文件(推荐,适配镜像频繁更新的场景)
不需要修改现有业务逻辑,仅需要调整镜像构建和启动配置:
- 修改
app服务对应的Dockerfile,在生成完/var/www/example所有内容之后,新增两行配置,备份原始文件、添加启动入口:
# 备份镜像内的原始站点文件到独立路径,避免被挂载覆盖 RUN cp -a /var/www/example /var/www.example.origin # 复制启动入口脚本并赋予执行权限 COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh # 替换默认入口 ENTRYPOINT ["entrypoint.sh"] # 保留你原来的CMD启动命令不变,比如原先是php-fpm就写CMD ["php-fpm"] CMD ["你的原有启动命令"]
- 新建
entrypoint.sh文件,放在Dockerfile同目录,内容如下:
#!/bin/sh # 同步镜像内原始站点文件到挂载的宿主机目录,仅更新差异文件 # 加--ignore-existing参数可保留宿主机已修改的文件,不需要可以删除 rsync -av --ignore-existing /var/www.example.origin/ /var/www/example/ # 执行原有启动命令 exec "$@"
- 调整你的
docker-compose.yml的volumes缩进(你当前配置的缩进有语法错误):
services: app: build: context: ./app dockerfile: Dockerfile container_name: app restart: always volumes: - "./www:/var/www/example"
后续每次重构镜像启动容器,都会自动把镜像内的最新初始文件同步到宿主机./www目录,你用rsync更新文件也可以双向同步。
方案2:先拷贝初始文件再挂载(适合镜像不频繁变更的场景,无需改镜像)
操作更简单,不需要修改镜像配置:
- 先注释掉
docker-compose.yml里的volumes挂载配置,启动容器:
docker-compose up -d app
- 把容器内已生成的站点文件拷贝到宿主机
./www目录:
docker cp app:/var/www/example/ ./www
- 停止容器,取消volumes配置的注释,重新启动容器即可:
docker-compose down docker-compose up -d app
注意事项
- 要确保容器内运行服务的用户UID/GID和宿主机
./www目录的所有者UID/GID一致,避免出现读写权限报错 - 如果需要限制宿主机修改只能同步到容器、禁止容器内修改写回宿主机,可以把挂载配置改为
"./www:/var/www/example:ro"(只读挂载),根据你的实际需求调整
内容的提问来源于stack exchange,提问作者mocart
相关产品推荐
相关产品推荐

