• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > 关于docker容器优雅退出的问题详解

关于docker容器优雅退出的问题详解

作者:ionic 字体:[增加 减小] 来源:互联网

本文主要包含退出docker容器,docker保存退出容器,退出docker容器,命令等服务器相关知识,ionic 希望可以进行参考

前言

最近因为工作的原因,谈到了关于如何正确的退出运行中的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:... 监听信号失败。

问题再于:我们docker inspect signal看一下

可以看到

Path:/bin/sh
Args:[
 -c,
 signal
]

或者docker exec signal ps 看一下可以看到pid为1的进程并不是signal, 而是shell.

所以原因找到了,是因为docker engine只给pid为1的进程发送信号,sh收到了信号而我们想要的signal进程没有收到信号

解决办法:

FROM golang:1.8.0
COPY main.go .
RUN go build -o signal && cp signal $GOPATH/bin
CMD ["signal"] # 不能写成 CMD signal, 这会直接exec,否则会以shell的方式派生子进程。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

您可能感兴趣的文章:

  • Docker 容器操作退出后进入解决办法
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于docker容器优雅退出的问题详解

相关文章

  • Vmware vSphere Client安装虚拟机图文教程
  • Docker简单安装与应用入门教程
  • 梦工厂数据中心:云和虚拟化不到20%
  • 通过提前bake Docker镜像加快基础设施的启动速度
  • Docker如何使用OpenvSwitch网桥
  • Docker 容器内存监控原理及应用
  • Docker aufs存储驱动layer、diff、mnt目录的区别介绍
  • 浅谈Docker 容器数据卷挂载小结
  • 详解通过Docker搭建Mysql容器+Tomcat容器连接环境
  • 如何用docker部署redis cluster的方法

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • Linux中docker的使用方法讲解
    • 创建的docker容器时间显示错误/date错误/时区错误
    • 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置
    • 虚拟化应用过程中易出现的五大错误
    • Docker获取镜像报错docker: Error response from daemon
    • Docker 教程之Docker Hub详细介绍
    • Docker学习之搭建ActiveMQ消息服务的方法步骤
    • CentOS 7下YUM 本地仓库的搭建详细步骤
    • Docker构建pinpoint部署的方法
    • docker 数据卷之进阶篇

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有