我一直在尝试在运行具有特定名称的docker容器上执行bash,如下所示。的 --(1)
docker ps | grep somename | awk '{print $1 " bash"}' | xargs -I'{}' docker exec -it '{}'
但它没有用,它显示了一条消息,如
“docker exec”需要至少2个参数
当我尝试使用命令时,如下所示 --(2)
docker ps | grep somename | awk '{print $1 " bash"}' | xargs docker exec -it
它显示了另一个错误消息,如
输入设备不是TTY
但是当我尝试使用$()(子shell)时,它可以完成,但我无法理解为什么它不适用于上面的两个代码(1)(2)(使用xargs)
任何机构都可以解释为什么会发生这种情况吗?
我非常感谢您提前提供的任何帮助=)
编辑1:
我知道如何以其他方式实现我的目标,例如
docker exec -it $(docker ps | grep perf | awk '{print $1 " bash"}' )
但我只是好奇为什么这些代码不起作用=)
答案 0 :(得分:4)
" docker exec"需要至少2个参数
在上一个管道命令中, xargs 的标准输入是,例如42a9903486f2 bash
。您使用 xargs 和 -I (替换字符串)选项。
因此,docker认识到42a9903486f2 bash
是第一个参数,没有第二个参数。
以下示例可能是您所期望的。
docker ps | grep somename | awk '{print $1 " bash"}' | xargs bash -c 'docker exec -it $0 $1'
输入设备不是TTY
xargs 对新子进程执行命令。因此,您需要重新打开stdin到子进程以进行交互式通信。 (MacOS:-o选项)
docker ps | grep somename | awk '{print $1 " bash"}' | xargs -o docker exec -it
答案 1 :(得分:0)
你运行的exec命令是这样的:
docker exec -it 'a1b2c3d4 bash'
这只是一个论点,而不是两个。您需要删除docker exec的参数周围的引号。
... | xargs -I'{}' docker exec -it {}
然后你将正确执行两个参数。
docker exec -it a1b2c3d4 bash
------ ---
first arg ^ ^ second arg
答案 2 :(得分:0)
这对我有用:
sudo docker ps -q | xargs -I'{}' docker exec -t {} du -hs /tmp/