使用没有docker exec的附加命令将命令发送到正在运行的容器

时间:2019-09-24 08:26:46

标签: docker

我有一个在接受输入命令的docker容器中运行的循环进程。目前,我必须使用docker attach <container>,然后在退出之前输入诸如restart之类的命令。

据我所知,我无法使用docker exec,因为我已经要与之交互的进程已经在运行,所以我是否可以通过编程方式将命令传递给docker attach? >

编辑:这是正在运行的程序内部的命令,而不是Shell可用的命令

2 个答案:

答案 0 :(得分:1)

一种解决方案可能是使用类似的东西:

echo "your input here" | docker attach <your container>

但是...这要求不要使用-t选项,这可能会导致您其他问题...


请检查以下问题:Redirect stdin to docker attach,其中Michael Crosby提供了一个示例:

  

此问题已解决。

docker run -i busybox sh -c "while true; do cat /dev/stdin; sleep 1; done;"
test

# ... from another terminal
echo test | docker attach 27f04f3fd73a

在此处应注意的是,当您使用--tty , -t (Allocate a pseudo-TTY)选项运行容器时,它不起作用。我还没有完全理解为什么会发生这种情况,所以我不会尝试解释,这里已经写了一些内容:Confused about Docker -t option to Allocate a pseudo-TTY


另外,来自docker run reference

  

对于交互式进程(如shell),必须一起使用-i -t才能为容器进程分配tty。 -i -t通常写为-it,如后面的示例所示。当客户端从管道接收其标准输入时,禁止指定-t < / strong>,例如:

$ echo test | docker run -i busybox cat

答案 1 :(得分:0)

还可以使用 expect 向具有终端的 docker 容器发送命令:

发送-t.exp:

#!/usr/bin/expect -f
set container [lindex $argv 0]
set command [lindex $argv 1]
spawn docker attach $container
send -- "$command\n"
expect "*\n"
expect "*\n"
# set timeout 1
# expect eof

用法:

send-t.exp container 'command args'

示例:

send-t.exp my-container 'find /'