如何将Docker容器内文件同步到宿主机,避免清理后数据丢失?
解决Docker容器内文件无法同步回宿主机及清理后文件丢失问题
问题
作为Docker新手,我创建了Ubuntu容器并通过COPY指令将宿主机文件复制到容器中,但容器工作目录下新建的文件/目录无法同步回宿主机原文件夹。由于测试时频繁执行docker system prune或docker rmi -f image_name清理容器和镜像,这些文件会随之丢失,需要实现容器到宿主机的文件同步方法。
当前配置
docker-compose.yml
version: '3' services: ubuntu: build: context: . dockerfile: Dockerfile image: ubuntu ports: - 8091 volumes: - ./dir:/dir volumes: dir: external: false
Dockerfile
FROM ubuntu:latest WORKDIR /dir VOLUME /dir RUN apt-get update RUN apt-get install -y EXPOSE 8000 COPY . . CMD ["/bin/bash"]
解决方案
1. 绑定挂载实现双向实时同步
你当前的docker-compose.yml已经配置了绑定挂载- ./dir:/dir,但存在逻辑问题:容器启动时,宿主机的./dir会直接覆盖容器内的/dir目录,导致COPY . .复制的文件被清空(如果宿主机./dir为空的话)。
调整方式:
- 先在宿主机创建
./dir目录,将需要同步的文件放入其中,再启动容器; - 或者修改Dockerfile,将初始化文件复制到非挂载目录,再在容器启动时复制到
/dir(比如在CMD中添加cp -r /init_dir/* /dir/)。
配置正确的绑定挂载后,容器内/dir的任何修改都会实时同步到宿主机./dir,清理容器/镜像后,宿主机的文件不会丢失。
2. 手动复制容器文件到宿主机
如果需要临时导出容器内的文件,可使用docker cp命令:
docker cp <containerId>:/file/path/within/container /host/path/target
- 执行
docker ps获取目标容器的<containerId>; - 替换
/file/path/within/container为容器内要导出的文件/目录路径; /host/path/target是宿主机接收文件的目标路径。
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

