上一篇文章介绍了runc的用法,这里面有两个非常重要的参数,Terminal和启动模式(前台启动和后台启动),下面我们就针对这两个参数,详细讲解一下。这两个参数两两组合就有四种情况。
在实验之前,我们将容器的启动脚本改成
#!/bin/sh
read input
echo “THIS IS STANDARD OUTPUT”
echo “YOU PROVIDED THIS AS STANDARD INPUT:”
echo $input
sleep 15
1、Terminal 为 true 前台启动
这种情况最简单,input 会一直hang住等待用户的输入,当我输入ddd 后,最后输出ddd
# runc run abc
ddd
“THIS IS STANDARD OUTPUT”
“YOU PROVIDED THIS AS STANDARD INPUT:”
ddd
程序一直会等待15 秒后退出。
2、 Terminal为false前台启动
在前台启动的时候,这个Terminal 为false没啥影响
# runc run def
gg
“THIS IS STANDARD OUTPUT”
“YOU PROVIDED THIS AS STANDARD INPUT:”
gg
我们还可以通过echo 输入内容
echo “TEST INPUT FROM COMMAND LINE” |sudo runc run alpine >container.out 2>&1
上面的命令会等待15s 执行完成,执行完输出如下:
“THIS IS STANDARD OUTPUT”
“YOU PROVIDED THIS AS STANDARD INPUT:”
“TEST INPUT FROM COMMAND LINE”
上面两种前台启动的方式,会启动两个进程,分别是runc和init_script 脚本。
$ ps -f -C runc -C sh
UID PID PPID C STIME TTY TIME CMD
root 4600 4598 0 15:42 pts/0 00:00:00 runc run alpine
centos 4609 4600 0 15:42 pts/0 00:00:00 /bin/sh init_script.sh
3、Terminal为false 后台启动
后台启动通过 -d 的方式,如下
echo “TEST INPUT FOR DETACHED FROM COMMAND LINE” |sudo runc run -d alpine
> container_detached.out 2>&1
对比前台启动hang在那里,后台启动迅速执行完,结果如下
# cat container_detached.out
“THIS IS STANDARD OUTPUT”
“YOU PROVIDED THIS AS STANDARD INPUT:”
“TEST INPUT FOR DETACHED FROM COMMAND LINE”
4、Terminal为true 后台启动
由于Terminal为true,需要用户的输入,如果直接后台启动会报如下错误,
$ sudo runc run -d alpine
cannot allocate tty if runc will detach without setting console socket
错误是说,需要一个控制台socket。runc官方提供了runc/contrib/cmd/recvtty/recvtty.go的脚本。我们可以打开一个新的shell窗口,通过recvtty启动一个监听。
./recvtty alpine_container_socket.sock
然后通过-d 启动
$ sudo runc run -d --console-socket alpine_container_socket.sock alpine
然后在recvtty里面会得到如下输出
TEST INPUT FROM SOCKET
TEST INPUT FROM SOCKET
THIS IS STANDARD OUTPUT
YOU PROVIDED THIS AS STANDARD INPUT:
TEST INPUT FROM SOCKET
如果通过后台启动的话,就只有一个 init_script 脚本。
$ ps -f -C runc -C sh
UID PID PPID C STIME TTY TIME CMD
centos 4916 1 0 16:16 pts/0 00:00:00 /bin/sh init_script.sh