Docker cp命令向容器复制文件不生效,报错提及无关other_image.png
问题产生原因
- 核心原因是你指定的容器内目标路径
/usr/share/app/public/img不是目录,而是一个已存在的文件,这个文件就是报错中出现的other_image.png,大概率是你此前给容器做了绑定挂载:将宿主机的/home/other_user/docker_services/app/other_image.png单文件直接挂载到了容器内的/usr/share/app/public/img路径上,导致该路径的类型从目录变成了单文件。 docker cp的逻辑是:如果目标路径是已存在的目录,会把源文件放到该目录下;如果目标路径是已存在的文件,会尝试用源文件覆盖该文件。你预期/usr/share/app/public/img是目录要放文件,但它实际是文件,所以触发底层挂载报错,报错信息会带出该路径实际对应的底层挂载文件也就是other_image.png的信息,和你本次要拷贝的image.png无关。
解决步骤
- 先核实挂载配置确认问题
执行以下命令查看容器的挂载信息,确认是否存在对应单文件挂载:
docker inspect my_container | grep Mounts -A 30
如果输出中存在将other_image.png挂载到/usr/share/app/public/img的规则,即可确认问题根因。
- 对应解决方案分两种场景:
- 场景1:需要保留容器内
/usr/share/app/public/img作为目录使用
修改容器的启动配置,将原来的单文件挂载改为目录挂载:把宿主机的/home/other_user/docker_services/app/目录(而不是里面的单个png文件)挂载到容器的/usr/share/app/public/img路径,重启容器后再执行原docker cp命令即可。
如果不需要保留现有挂载,也可以直接操作容器调整路径后再拷贝:
# 如果路径已存在为文件先删除 docker exec -it my_container rm -f /usr/share/app/public/img # 递归创建目标目录 docker exec -it my_container mkdir -p /usr/share/app/public/img # 再执行拷贝命令 sudo docker cp /home/myusername/image.png my_container:/usr/share/app/public/img
- 场景2:不需要修改现有挂载规则
直接把要拷贝的image.png放到宿主机的/home/other_user/docker_services/app/目录下即可,因为绑定挂载是双向同步的,宿主机该目录下新增的文件会自动同步到容器对应的挂载路径中,不需要额外执行docker cp。
内容的提问来源于stack exchange,提问作者kr_v
相关产品推荐
相关产品推荐

