如何使用docker cp命令复制并替换Docker容器中的目录
解决Docker cp无法完全替换目录的问题
要实现本地目录custom-data-src和容器内/data/custom-data-dest的完全同步(包括删除源目录已不存在的文件),可以用以下几种方法:
方法1:先清空容器目标目录,再复制
先删除容器内目标目录的所有内容(包括隐藏文件),再执行复制命令:
# 清空目标目录(兼容隐藏文件,忽略不存在文件的报错) docker exec <container_name> sh -c 'rm -rf /data/custom-data-dest/* /data/custom-data-dest/.[!.]* /data/custom-data-dest/..?* 2>/dev/null' # 复制源目录内容到容器 docker cp custom-data-src/. <container_name>/data/custom-data-dest
这种方式简单直接,适合一次性同步,但如果目标目录有特殊权限配置,清空后需要重新设置。
方法2:删除并重建目标目录
直接删除整个目标目录,再重新创建后复制,确保完全替换:
# 删除容器内的目标目录 docker exec <container_name> rm -rf /data/custom-data-dest # 重新创建目标目录(-p确保父目录存在) docker exec <container_name> mkdir -p /data/custom-data-dest # 复制源目录内容 docker cp custom-data-src/. <container_name>/data/custom-data-dest
这个方法最彻底,不会残留任何旧文件,但如果目标目录本身有特殊的权限或挂载属性,重建后需要重新配置。
方法3:用rsync实现增量同步(推荐频繁同步场景)
如果需要频繁同步目录,rsync的--delete参数可以自动删除目标目录中源目录没有的文件,实现完全同步。首先确保容器内已安装rsync(比如基于Debian/Ubuntu的镜像执行apt update && apt install -y rsync,CentOS/RHEL则用yum install -y rsync),然后执行:
# 通过管道将本地rsync输出传给容器内的rsync rsync -av --delete custom-data-src/ - | docker exec -i <container_name> rsync -av --delete - /data/custom-data-dest/
这种方式支持增量同步,只传输变化的文件,效率更高,还能保留目录权限和属性。
内容的提问来源于stack exchange,提问作者GodAceTheKid
相关产品推荐
相关产品推荐

