使用xargs命令通过docker exec运行bash

7

我一直在尝试在运行特定名称的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)时,可以完成操作,但我不明白为什么使用xargs的上述两个代码(1)(2)无法工作。

有人能解释一下为什么会发生这些吗?

提前感谢您提供的任何帮助=)




编辑1:

我知道如何用其他方法实现我的目标

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

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

你的第一个编辑是唯一的解决方案。谢谢! - Juan Ignacio Barisich
3个回答

16
  • 第一个问题

"docker exec" 需要至少2个参数。

在上一个管道命令中,xargs 的标准输入为例如 42a9903486f2 bash。而您使用了带有-I(替换字符串)选项的xargs命令。 因此,Docker 认为 42a9903486f2 bash 是第一个参数,而没有第二个参数。

下面的示例或许是您期望的内容。

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

输入设备不是TTY

xargs 在新的子进程上执行命令。因此,您需要重新打开标准输入以进行交互式通信。(在MacOS上使用 -o 选项)

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

这是我期望的完美答案。非常感谢您的友善回答 =) 它真的帮了我很多。 - Abraxas5

2
这对我有用:

这个对我有效:

sudo docker ps -q | xargs -I'{}' docker exec -t {} du -hs /tmp/

0
您运行的exec命令大致如下:
docker exec -it 'a1b2c3d4 bash'

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

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

接着你就可以使用两个参数正常地执行了。

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

谢谢Dan。我也尝试使用以下命令:"docker ps | grep somename | awk '{print $1 " bash"}' | xargs -I'{}' docker exec -it {}"但是它对我没有用^^;它显示了类似于第一次尝试的结果,即"docker exec"需要至少2个参数的消息。 - Abraxas5
@user3400490 在那次尝试中你遇到了什么错误? - Dan Lowe
“docker exec” 至少需要2个参数,就像第一次尝试的结果一样。 - Abraxas5
@Abraxas5 在上面你使用了 docker exec -it 但是没有加上 {}。这是两个不同的东西... 你试过加上 {} 但是不要加引号吗? - Dan Lowe
顺便提一下,你应该使用 docker ps --filter 命令,参考这个(过时的)文档 https://docs.docker.com/v1.11/engine/reference/commandline/ps/ 和其中的例子。 - user2915097
显示剩余3条评论

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