在docker exec命令中使用'*'

29
我正在尝试在运行中的Docker容器内执行特定命令。
 Docker exec -t containername1 ls /tmp/sth/*

作为回报,我得到了
 ls: cannot access '/tmp/sth/*': No such file or directory

实际上,当我在容器内执行命令时,一切都正常工作。容器使用的是Debian系统,而本地机器使用的是Windows系统。我一直在尝试找到解决方法,但是没有成功。

3
这是正常/预期的行为。在UNIX世界中,通配符在程序启动之前由您的Shell扩展;因此,当调用ls时,它期望已经传递了/tmp/sth目录下的文件列表,而不是通配符。在这种情况下,通配符仅在容器内有效,因此容器外部的Shell无法看到结果以扩展它。 - Charles Duffy
1个回答

45
如果你想在容器内部扩展glob,你需要在容器内运行一个shell。容器外的shell无法看到容器内的文件(当然),因此它会将ls命令传递给字面模式,而不是你意图中目录中的文件列表。
因此:
docker exec -t t1 sh -c "ls /tmp/sth/*"

请注意,通常我会在命令中使用单引号,但由于您的主机是Windows,请使用双引号,因为它们更有可能在cmd.exe中正常工作。

谢谢你的回答。你提供的代码完全有效,并且你还解答了“为什么?”这个问题,这总是很好的 ;) - Wiciaq123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接