You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器内/var/www/example目录如何反向同步到宿主机本地./www目录

问题核心原因

Docker 绑定挂载(bind mount)的默认逻辑是宿主机目录内容完全覆盖容器内对应路径的内容,你当前的配置是空的宿主机./www目录覆盖了镜像内已生成的/var/www/example内容,属于设计层面的默认行为

解决方案

方案1:容器启动自动同步初始文件(推荐,适配镜像频繁更新的场景)

不需要修改现有业务逻辑,仅需要调整镜像构建和启动配置:

  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 ["你的原有启动命令"]
  1. 新建entrypoint.sh文件,放在Dockerfile同目录,内容如下:
#!/bin/sh
# 同步镜像内原始站点文件到挂载的宿主机目录,仅更新差异文件
# 加--ignore-existing参数可保留宿主机已修改的文件,不需要可以删除
rsync -av --ignore-existing /var/www.example.origin/ /var/www/example/
# 执行原有启动命令
exec "$@"
  1. 调整你的docker-compose.yml的volumes缩进(你当前配置的缩进有语法错误):
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: app
    restart: always
    volumes:
      - "./www:/var/www/example"

后续每次重构镜像启动容器,都会自动把镜像内的最新初始文件同步到宿主机./www目录,你用rsync更新文件也可以双向同步。

方案2:先拷贝初始文件再挂载(适合镜像不频繁变更的场景,无需改镜像)

操作更简单,不需要修改镜像配置:

  1. 先注释掉docker-compose.yml里的volumes挂载配置,启动容器:
docker-compose up -d app
  1. 把容器内已生成的站点文件拷贝到宿主机./www目录:
docker cp app:/var/www/example/ ./www
  1. 停止容器,取消volumes配置的注释,重新启动容器即可:
docker-compose down
docker-compose up -d app

注意事项

  • 要确保容器内运行服务的用户UID/GID和宿主机./www目录的所有者UID/GID一致,避免出现读写权限报错
  • 如果需要限制宿主机修改只能同步到容器、禁止容器内修改写回宿主机,可以把挂载配置改为"./www:/var/www/example:ro"(只读挂载),根据你的实际需求调整

内容的提问来源于stack exchange,提问作者mocart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:48:02