2017-04-19 385 views
1

我一直试图在运行docker容器时执行bash,它具有如下的特定名称。 --(1)用xargs命令使用docker exec运行`bash`

docker ps | grep somename | awk '{print $1 " bash"}' | xargs -I'{}' docker exec -it '{}' 

但没有工作,它示出了像

消息 “搬运工EXEC” 需要至少2个参数(多个)




当我尝试使用命令如下--(2)

docker ps | grep somename | awk '{print $1 " bash"}' | xargs docker exec -it 

它示出了像

另一个错误信息输入设备不是TTY




但是,当我尝试使用$()(分壳),那么它可以完成,但我不明白为什么它不适用于两个代码(1)(2)以上(使用xargs)

任何人都可以解释为什么会发生这种情况?

我真的很感激任何帮助,您可以提前提供=)




编辑1:

我知道如何实现我的目标以其他方式像

docker exec -it $(docker ps | grep perf | awk '{print $1 " bash"}') 

但我只是好奇为什么这些代码不工作=)

回答

2
  • 第一个问题

“搬运工EXEC” 需要至少2个参数(多个)

在最后一个管道命令,的xargs的是标准输入,例如,42a9903486f2 bash。并且您使用xargs-I(替换字符串)选项。 因此,码头认识到42a9903486f2 bash是第一个参数,没有第二个参数。

下面的例子也许是你所期望的。

docker ps | grep somename | awk '{print $1 " bash"}' | xargs bash -c 'docker exec -it $0 $1' 
  • 第二个问题

输入设备不是TTY

xargs的 excutes上新的子过程命令。所以你需要重新打开stdin到子进程进行交互式通信。 (MacOS:-o选项)

docker ps | grep somename | awk '{print $1 " bash"}' | xargs -o docker exec -it 
+0

这是我期望的完美答案。我真的很感激你的回答=)它真的帮了我很多 – Abraxas5

0

运行exec命令是这样的:

docker exec -it 'a1b2c3d4 bash' 

而这仅仅是一个参数,而不是两个。您需要删除docker exec参数的引号。

... | xargs -I'{}' docker exec -it {} 

然后你会用两个参数正确执行。

docker exec -it a1b2c3d4 bash 
       ------ --- 
     first arg^ ^second arg 
+0

谢谢丹。 “| grep的somename | awk的 '{打印$ 1 bash的 ”泊坞窗} PS“' | 我也使用 试图xargs的-I '{}' 泊坞窗EXEC -IT {}” 但它并没有为我工作^^; 它显示消息'“docker exec”需要至少2个参数“,就像第一次尝试的结果一样。 – Abraxas5

+0

@ user3400490您在尝试中遇到什么错误? –

+0

'“docker exec”需要至少2个参数(如第一次尝试的结果)。 '如上面编辑的注释=) – Abraxas5