用xargs命令使用docker exec运行`bash`
我一直试图执行运行docker集装箱具有特定名称,如下所示。 --(1)
docker ps | grep somename | awk '{print $1 " bash"}' | xargs -I'{}' docker exec -it '{}'
但它不起作用,并显示一条消息
“docker执行”至less需要2个参数
当我尝试使用命令如下--(2)
docker ps | grep somename | awk '{print $1 " bash"}' | xargs docker exec -it
它显示了另一个错误消息
input设备不是TTY
但是,当我尝试使用$()(子shell),那么它可以完成,但我不明白为什么它不能与上面的两个代码(1)(2) (使用xargs)
有没有人能解释为什么会发生这种情况
我真的很感激你提前提供的任何帮助=)
编辑1:
我知道如何以其他方式完成我的目标
docker exec -it $(docker ps | grep perf | awk '{print $1 " bash"}' )
但我只是好奇为什么这些代码不工作=)
- 第一个问题
“docker执行”至less需要2个参数
在最后一个pipe命令中, xargs的标准input是例如42a9903486f2 bash
。 你用-I (replacestring)选项使用xargs 。 所以, 42a9903486f2 bash
认识到42a9903486f2 bash
是第一个参数,没有第二个参数。
下面的例子也许是你所期望的。
docker ps | grep somename | awk '{print $1 " bash"}' | xargs bash -c 'docker exec -it $0 $1'
- 第二个问题
input设备不是TTY
xargs在新的subprocess中执行命令。 所以你需要重新打开stdin到subprocess进行交互式通信。 (MacOS:-o选项)
docker ps | grep somename | awk '{print $1 " bash"}' | xargs -o docker exec -it
你运行的exec命令是这样的:
docker exec -it 'a1b2c3d4 bash'
这只是一个参数,而不是两个。 您需要删除docker exec参数的引号。
... | xargs -I'{}' docker exec -it {}
那么你会用两个参数正确地执行。
docker exec -it a1b2c3d4 bash ------ --- first arg ^ ^ second arg