带:default选项的Docker Volume无法同步容器数据至本地的问题
问题分析与解决方法
你的需求是将容器内生成的Vue项目同步到本地目录,但当前配置无法实现,核心原因是本地绑定挂载会覆盖容器内的目标目录内容:当你用./shared/project:/var/www/html/project挂载时,如果本地./shared/project为空,容器启动后该目录会被本地空目录覆盖,导致Dockerfile中生成的Vue项目无法显示。:default选项仅对Docker命名卷生效,对本地目录挂载不起作用。
解决步骤
1. 先让容器生成Vue项目并复制到本地
暂时移除docker-compose里的volumes配置,修改后的docker-compose.yml:
version: "3.3" services: Web: build: context: ./ dockerfile: ./Dockerfile.web.dev image: nginx tty : true ports: - 5002:3000
执行构建并启动容器:
docker-compose up --build -d
若本地./shared/project不存在,先创建目录:
mkdir -p ./shared/project
将容器内的Vue项目复制到本地:
docker-compose exec Web cp -r /var/www/html/project/. ./shared/project/
2. 恢复挂载配置并重启容器
把volumes配置加回docker-compose.yml:
version: "3.3" services: Web: build: context: ./ dockerfile: ./Dockerfile.web.dev image: nginx tty : true volumes: - ./shared/project:/var/www/html/project ports: - 5002:3000
重启容器:
docker-compose down && docker-compose up -d
此时本地./shared/project会与容器内目录双向同步,容器和本地的修改会互相同步。
备选方案:用命名卷自动同步初始内容
如果不想手动复制,可使用Docker命名卷,它会自动将容器内目录的初始内容复制到卷中:
修改docker-compose.yml:
version: "3.3" services: Web: build: context: ./ dockerfile: ./Dockerfile.web.dev image: nginx tty : true volumes: - vue-project:/var/www/html/project ports: - 5002:3000 volumes: vue-project:
启动容器后,命名卷vue-project会包含容器内的Vue项目。若要将卷内容同步到本地,可通过临时容器复制:
docker run --rm -v vue-project:/source -v ./shared/project:/target busybox cp -r /source/. /target/
内容的提问来源于stack exchange,提问作者J.Bon
相关产品推荐
相关产品推荐

