我有一个在接受输入命令的docker容器中运行的循环进程。目前,我必须使用docker attach <container>
,然后在退出之前输入诸如restart
之类的命令。
据我所知,我无法使用docker exec
,因为我已经要与之交互的进程已经在运行,所以我是否可以通过编程方式将命令传递给docker attach
? >
编辑:这是正在运行的程序内部的命令,而不是Shell可用的命令
答案 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 /'