信号 | 值 | 描述 |
1 | SIGHP | 挂起进程 |
2 | SIGINT | 终止进程 |
3 | SIGQUIT | 停止进程 |
9 | SIGKILL | 无条件终止进程 |
15 | SIGTERM | 尽可能终止进程 |
17 | SIGSTOP | 无条件停止进程,但不是终止进程 |
18 | SIGTSTP | 停止或暂停进程,但不终止进程 |
19 | SIGCONT | 继续运行停止的进程 |
FROM tarscloud/tars-env-full COPY entrypoint.sh /sbin/ RUN chmod 755 /sbin/entrypoint.sh ENTRYPOINT [ "/sbin/entrypoint.sh" ]
可以看到,我们将entrypoint.sh脚本作为容器启动时PID=1的程序。 下面我们将编写entrypoint.sh,在脚本中捕捉SIGTERM信号, entrypoint.sh 实例
#!/bin/bash # 在容器关闭前,优雅的关闭服务并下线服务 function stop_server() { if [ -f "/usr/local/tars-auto/stop_tars_server.go" ]; then echo "/usr/local/tars-auto/stop_tars_server.go exist, will run." go run /usr/local/tars-auto/stop_tars_server.go exit else echo "stop file not exist" exit fi } # 捕捉docker stop时发送的SIGTERM信号 trap 'stop_server' SIGTERM
trap 'stop_server' SIGTERM就是捕捉SIGTERM的代码,trap是shell脚本中专门用来捕捉信号的方法。 第二个参数“stop_server”是指捕捉到信号后要执行的命令, 可以看到stop_server函数中执行了一个stop_tars_server.go的脚本,当然可以根据其他需要进行替换。 我们通过上面的dockerfile,启动了一个容器, 执行
docker exec -it tars-node bash进入容器内部,再执行top 1,查看当前所有进程,如下图:
可以看到进程ID=1的程序是enterypoint的执行程序。 2. 停止容器 接来下我们执行docker stop
docker stop tars-node
执行后,查看容器日志:
docker logs -f tars-node
可以看到,enterypoint.sh脚本中stop_server函数的echo打印正确输出了:
并且还打印输出了go脚本中的执行日志,也就是文章最开头提到的关闭服务、下线服务的内容。 至此,我们成功做到了在执行docker stop后,让需要的自定义操作在容器关闭前执行。