使用docker exec和xargs命令运行`bash`

时间:2017-04-19 17:54:09

标签: docker xargs

我一直在尝试在运行具有特定名称的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"}' )

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

3 个答案:

答案 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/