如何在docker容器内无键盘输入实现detach或转为daemon进程
容器内部无交互实现detach/后台运行的方案
默认大家熟知的Ctrl+P Ctrl+Q是键盘交互触发的detach操作,完全可以通过脚本/命令实现无手动输入的detach,或者让进程以daemon模式持续运行,可行方案如下:
- 方案1:发送信号直接触发容器detach(通用无依赖)
直接在容器内执行如下命令即可:kill -SIGTTIN 1
这个方案对启动时加了-t参数分配了tty的容器稳定生效,原理是Docker的attach会话默认会捕获容器主进程(PID=1的init进程)收到的SIGTTIN信号,触发自动detach逻辑。命令执行后当前终端会直接切回宿主机,容器全程保持运行状态,不需要任何快捷键操作,可以直接写到任意自动化脚本里调用。注意:不要执行
exit或者直接kill主进程的操作,这类操作会直接终止容器主进程,导致容器退出,达不到后台运行的效果。 - 方案2:挂载docker.sock时主动控制容器状态
如果启动容器时挂载了宿主机的/var/run/docker.sock,且容器内有docker客户端,可以先获取当前容器ID,再主动将容器切为后台运行态,示例命令:
执行完后退出当前会话即可,容器会持续在后台运行。# 获取当前容器ID CURRENT_CID=$(cat /proc/1/cpuset | cut -c9-) # 后台执行容器状态调整,避免阻塞当前会话 docker update --restart=always $CURRENT_CID >/dev/null 2>&1 & - 方案3:仅让业务进程脱离当前会话(不需要detach整个容器时用)
如果不需要把整个容器切出当前终端,只需要让运行业务的进程不随会话关闭而终止,可以直接用Linux自带的进程会话脱离命令启动业务:setsid 你的业务启动命令 &
或者nohup 你的业务启动命令 >/var/log/your_app.log 2>&1 &
执行后即使你直接退出当前exec/attach会话,业务进程也会在容器内持续运行,不会被挂断。
以上所有操作都不需要任何手动键盘输入,所有命令都可以直接嵌入自动化脚本执行
内容的提问来源于stack exchange,提问作者XIIX
相关产品推荐
相关产品推荐

