在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 最近因为工作的原因,谈到了关于如何正确的退出运行中的docker容器,这是一个非常值得讨论的话题了。本文将给出详细的介绍,下面来一起看看吧。 容器信号使用 我们跑在容器中的程序通常想在容器退出之前做一些清理操作,比较常用的方式是监听一个信号,延迟关闭容器。 docker提供了这样的功能: ╰─➤ 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) docker 1.13以上版本在创建容器时可直接指定STOP_TIMEOUT 和STOP_SIGNAL参数: $ docker run --help ... --stop-signal string Signal to stop a container, SIGTERM by default (default "SIGTERM") --stop-timeout int Timeout (in seconds) to stop a container ... 但是。。。 我们测试一个: package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { fmt.Println("signal test") go func() { for { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGTERM) s := <-c fmt.Println("Got signal:", s) } }() time.Sleep(time.Second * 100) } Dockerfile: FROM golang:1.8.0 COPY main.go . RUN go build -o signal && cp signal $GOPATH/bin CMD signal 构建: docker build -t signal:latest . 运行: docker run --name signal signal:latest 再开一终端,运行: docker stop -t 10 signal 发现并没有打印出Got signal:... 监听信号失败。 问题再于:我们 可以看到 Path:/bin/sh Args:[ -c, signal ] 或者 所以原因找到了,是因为 解决办法: FROM golang:1.8.0 COPY main.go . RUN go build -o signal && cp signal $GOPATH/bin CMD ["signal"] # 不能写成 CMD signal, 这会直接exec,否则会以shell的方式派生子进程。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对极客世界的支持。 |
请发表评论