以下文章来源Java后端栈,回复”面试“获面试宝典
扫码关注带你吊爆Java后端技术
哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将后端君的公众号 加星标置顶 ,在此真诚的表示感谢~
来源:blog.opskumu.com/graceful-shutdown-docker.html
上一篇:基于 SpringBoot2 + MybatisPlus 的商城管理系统(附源码)
正文
大家好,我是栈哥。
最近把 Docker 官方的 Docker Reference 文档又读了一遍,发现有些细节深究起来,还是有很多可挖的。针对写 Dockerfile ,大部分时候只要照葫芦画瓢,基本也不会有什么大的问题,但是如果再深入理解一下那就更有意思了。
要说如何优雅的关闭容器,那就不得不提到信号(Signal)的理念,以及 Dockerfile 中 ENTRYPOINT 和 CMD 指令了。在具体说优雅关闭之前,先了解一下信号这个 Linux 中的基础概念。
信号是事件发生时对进程的通知机制,有时也称之为软件中断。
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT
4) SIGILL 5) SIGTRAP 6) SIGABRT
7) SIGBUS 8) SIGFPE 9) SIGKILL
10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM
... ...
1) SIGHUP 当终端断开(挂机)时,将发送该信号给终端控制进程。SIGHUP 信号还可用于守护进程(比如,init 等)。许多守护进程会在收到 SIGHUP 信号时重新进行初始化并重读配置文件。
1) SIGHUP
2) SIGINT 当用户键入终端中断字符(通常为 Control-C ) 时,终端驱动程序将发送该信号给前台进程组。该信号的默认行为是终止进程。
2) SIGINT
3) SIGQUIT 当用户在键盘上键入退出字符(通常为 Control-\ )时,该信号将发往前台进程组。默认情况下,该信号终止进程,并生成用于调试的核心转储文件。进程如果陷入无限循环,或者不再响应时,使用 SIGQUIT 信号就很合适。
3) SIGQUIT
9) SIGKILL 此信号为 “必杀(sure kill)” 信号,处理器程序无法将其阻塞、忽略或者捕获,故而 “一击必杀”,总能终止程序。
9) SIGKILL
15) SIGTERM 这是用来终止进程的标准信号,也是 kill 、 killall 、 pkill 命令所发送的默认信号。精心设计的应用程序应当为 SIGTERM 信号设置处理器程序,以便其能够预先清除临时文件和释放其它资源,从而全身而退。因此,总是应该先尝试使用 SIGTERM 信号来终止进程,而把 SIGKILL 作为最后手段,去对付那些不响应 SIGTERM 信号的失控进程。基于 SpringBoot2 + MybatisPlus 的商城管理系统(附源码)
15) SIGTERM
kill
killall
pkill
SIGTERM
SIGKILL
20) SIGTSTP 这是作业控制的停止信号,当用户在键盘上输入挂起字符(通常为 Control-Z )时,将该信号给前台进程组,使其停止运行。
20) SIGTSTP
以上知识大部分都来自 《Linux/UNIX 系统编程手册》,想要了解更多的,可以查看该书上册的 20、21、22 章节。
CMD
CMD ["executable","param1","param2"] (exec 格式, 推荐使用这种格式)
CMD ["executable","param1","param2"]
CMD ["param1","param2"] (作为 ENTRYPOINT 指令参数)
CMD ["param1","param2"]
CMD command param1 param2 (shell 格式,默认 /bin/sh -c )
CMD command param1 param2
ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"] (exec 格式,推荐优先使用这种格式)
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2 (shell 格式)
ENTRYPOINT command param1 param2
Dockerfile
/bin/sh -c
docker stop
➜ ~ docker stop --help
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
Stop one or more running containers
Options:
--help Print usage
-t, --time int Seconds to wait for stop before killing it (default 10)
-t
➜ ~ docker kill --help
Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]
Kill one or more running containers
-s, --signal string Signal to send to the container (default "KILL")
docker kill
-s
➜ ~ cat signals.go
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}
➜ ~ GOOS=linux GOARCH=amd64 go build signals.go
➜ ~ ls
Dockerfile signals signals.go
➜ ~ cat Dockerfile
FROM busybox
COPY signals /signals
CMD ["/signals"] # exec 格式执行
➜ ~ docker build -t signals .
➜ ~ docker run -it --rm --name signals signals
awaiting signal
terminated
exiting
➜ ~ time docker stop signals
signals
docker stop signals 0.01s user 0.02s system 4% cpu 0.732 total
➜ ~
CMD /signals # shell 格式执行
docker stop signals 0.01s user 0.01s system 0% cpu 10.719 total
Dockerfile signals signals.go start.sh
COPY start.sh /start.sh # 引入 shell 脚本启动
CMD ["/start.sh"]
➜ ~ cat start.sh
#!/bin/sh
/signals
docker stop signals 0.01s user 0.02s system 0% cpu 10.765 total
exec /signals # 加入 exec 执行
docker stop signals 0.02s user 0.02s system 4% cpu 0.744 total
最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:“面试”获取。
◆ ◆ ◆ ◆ ◆
字节跳动面试经验总结,已顺利拿到offer!
IntelliJ IDEA这样配置,代码效率嗖嗖的~
Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)
分享一个牛逼的 Java 开源后台管理系统,不要造轮子了!
硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统(附源码)!
一款强大的可视化分布式数据同步工具
不要再封装各种Util工具类了,这个神级框架值得拥有!
公司规定所有接口都用 POST请求,这是为什么?
SpringBoot 全局异常拦截器
程序员 30 种提高工作效率的利器
IDEA 官方数据库管理神器,比 Navicat 还香?
欢迎添加栈哥个人微信 ysle007 进粉丝群或围观朋友圈
文章有问题?点此查看未经处理的缓存