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

Running `bash` using docker exec with xargs command

我一直在尝试在 运行 docker 容器上执行 bash,具体名称如下。 --(1)

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

但它没有用,它显示了类似

的消息

"docker exec" requires at least 2 argument(s)




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

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

它显示另一个错误消息,例如

the input device is not a TTY




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

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

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




编辑 1:

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

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

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

你运行的exec命令是这样的:

docker exec -it 'a1b2c3d4 bash'

这只是一个论点,不是两个。您需要删除 docker exec.

参数周围的引号
... | xargs -I'{}' docker exec -it {}

那么你将使用两个参数正确执行。

docker exec -it a1b2c3d4 bash
                 ------   ---
         first arg ^       ^ second arg
  • 第一题

"docker exec" requires at least 2 argument(s)

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

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

docker ps | grep somename | awk '{print   " bash"}' | xargs bash -c 'docker exec -it [=10=] '
  • 第二个问题

the input device is not a TTY

xargs 在新的子进程上执行命令。所以需要重新打开stdin给子进程进行交互通信。 (MacOS:-o 选项)

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

这对我有用:

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