docker cp报requires exactly 2 arguments错误原因咨询
问题原因
报错核心是Shell通配符预展开机制,和docker本身的参数解析逻辑无关:
- 执行第一条命令
docker cp local_dir/*.py image_name:remote_dir时,Shell会在调用docker命令前,先尝试解析路径里的*通配符:
如果local_dir下存在多个.py后缀文件,Shell会直接把local_dir/*.py展开为所有匹配文件的完整路径。举个例子,要是目录下有a.py、b.py两个文件,实际传给docker的命令就变成了:
此时传给docker cp local_dir/a.py local_dir/b.py image_name:remote_dirdocker cp的参数一共3个(两个源文件路径+1个目标路径),不符合命令要求的「源路径、目标路径恰好2个参数」的规则,自然会抛出参数数量错误。
要是你用的Shell开了failglob选项,当*.py匹配不到任何文件时,Shell会直接中断命令,也可能抛出同类参数错误。 - 第二条命令
docker cp local_dir/. image_name:remote_dir里的源路径local_dir/.是固定字面量路径,没有通配符,Shell不会做额外展开,传给docker的参数永远是源、目标两个,所以能正常执行。这个写法的作用是把local_dir目录下的所有内容(包括隐藏文件)复制到容器内的remote_dir路径。
补充说明
docker cp本身不支持通配符解析,如果要把宿主机上多个符合后缀规则的文件复制到容器,别直接在路径里写通配符,可以先进入对应目录后逐个传入文件路径,或者配合管道、tar命令完成批量复制。
内容的提问来源于stack exchange,提问作者Lan Si
相关产品推荐
相关产品推荐

