详解docker 容器不自动退出结束运行的方法
作者:big_cat 发布时间:2022-05-25 21:48:24
本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。
docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。
比如 docker hello-world
# 一闪而过 输出一堆东西
docker run --name hello-world hello-world
# 可以看到 hello-world 容器已经退出了
docker ps -a
那怎样可以让容器不自动退出呢?如果我们想登入一个纯净的容器 alpine/centos/ubuntu 之类的,在其基础上安装一些服务组件,然后在 commit 成自己的镜像。
看网上有不少方法是创建容器时执行一个 while(true) 的死循环(当然,sleep 一下)或者用 tail -f /dev/null 一类的,反正就是以开启一个可以常驻的前置进程为目的。其实我们可以更优雅的使用 docker 容器的 interactive 和 tty 参数来将 sh/bash (*nix 系统必有)命令作为前置命令开启,这样容器就不会自动退出了。
例如使用 alpine 镜像做为基础镜像,创建一个 alpine 系统小容器,让其可以常驻运行,以便我们登录交互执行某些命令。
# 使用 alpine 系统镜像创建容器
# -i interactive=true 开启 stdin
# -t tty=true 分配会话终端
# -d 守护模式 不加也可以 不加就直接进入容器中了 需要 ctrl+p+q 切出
# 不能 exit 哟, exit 相当于结束 sh 会话了 容器会退出的
docker run -it -d --name alpine alpine sh
# alpine 肯定在运行
docker ps
# 登入容器
docker exec -it alpine sh
# apline 使用的 apk 作为包管理
# 安装个小火车
# 后续可以使用 docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl 生成新的镜像
apk add sl
# 退出容器 注:-d 启动的才可以,如果没有 -d 启动直接进入的 sh终端 则不能退出,否则容器也会退出
exit
提交容器变更生成新的镜像
docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl
docker images
# 有账号的话发布到 docker hub 上去
docker push big_cat/alpine_sl
# 后续停止/启动容器时就不需要在指定 -it 参数了
docker stop alpine
docker start alpine
提交容器变更生成新的镜像
docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sl
docker images
# 有账号的话发布到 docker hub 上去
docker push big_cat/alpine_sl
以上命令其实是借助 sh/bash 会话终端作为前置进程,使得容器不会自动退出。
如果你觉得在创建容器时如此书写会很粗陋,没关系,我们可以将这些都推给 docker-compose
docker-compose.yml
version: '3'
services:
big_cat_alpine:
container_name: big_cat_alpine
image: alpine
stdin_open: true # -i interactive
tty: true # -t tty
privileged: true
entrypoint: ["sh"] # 执行 sh
创建容器 & 登入容器
docker-compose up -d big_cat_alpine ./
docker ps
docker exec -it big_cat_alpine sh
通过 docker-compose 将那两个参数传入进去,编排后启动服务容器。
来源:https://segmentfault.com/a/1190000017967660
猜你喜欢
- 事先声明,本人是新手站长,假如其中有不当的地方请指正,不咬骂偶。 本人做站几年了,不过是在单位里面做,写一些小系统,所以很少接触什
- 查看cpuinfo中是否有lm,如果有lm表示支持64位,lm的意思是long mode,具体命令如下:cat /proc/cpuinfo&
- 《商业大亨》的“赢在大亨挑战赛”今天将产生第3个周冠军,周冠军除了可以获得丰厚奖品外,还将有资格参加单服月晋级赛。想参加月晋级赛的大亨们可要
- 咱老百姓,今儿我是真呀真高兴(吼)咱老百姓,今儿我是真呀真高兴(嘿)咱老百姓,今儿我是真呀真高兴(吼)咱老百姓高兴,高兴今儿我是真呀真高兴(
- Rand Fishkin(Randfish) :搜索引擎专家倪英伟: 厦门时义浩维科技有限公司副总裁,网络营销专家陈小华(石头):
- 一、Java环境搭建(1)下载JDK并解压(当前操作系统为Ubuntu16.04,jdk版本为jdk-8u111-Linux-x64.tar
- UCenter Home 提供了方便的日志导入功能,您可以将自己在其他站点发表的日志导入到 UCenter Home 的日志中。该功能需要您
- 一次在网上闲逛,突然看到论坛有一条消息说有一种方法,可以让已经关闭的Linux机器继续运行ipchains,并且让这台机器继续实现防火墙的功
- OpenStack Heat AutoScaling一、背景Openstack的Heat是在H版之后加入的组件,旨在创建一套业务流程,更轻松
- 一、什么是copy_{to,from}_user()它是kernel space和user space沟通的桥梁。所有的数据交互都应该使用类
- 最近横着走同学貌似在研究CDN.为了威望早点到200.特写一小文章.跟大家一起学习.我们先Google一下CDN的概念:CDN 是一个经策略
- 当标题的长度超过限制,就会在后面自动添加 ...可以通过修改下面的文件来取消显示 省略号 分别打开:\module\a
- 由于产品的需要,最近在配置apache的负载均衡功能,但是在配置虚拟主机的访问权限的时候我们遇到了一些问题。主要问题是deny和allow的
- 今天看到了inmay的关于培训班的帖子,一时间感慨很多。想自己来网家4年了,一直潜水淘东西而没有贡献什么,今天就把我这四年的网赚之路总结一下
- 北京时间10月16日消息,据国外媒体报道,谷歌周四在分析师电话会议中再次表示,旗下视频网站YouTube“不远的将来&a
- 23. 服务名称: helpsvc显示名称: Help and Support服务描述: 启用在此计算机上运行帮助和支持中心。如果停止服务,
- 一,nfs服务优缺点NFS服务简介NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由
- 安装首先需要安装好Java和Scala,然后下载Spark安装,确保PATH 和JAVA_HOME 已经设置,然后需要使用Scala的SBT
- 收录新站点的角度来说,Google比Baidu快。从站点内容修改更新后,收录内容的更新来说,Google还是领先。最近的一次观察,也就是中美
- 论坛营销是指网络营销人员寄宿在第三方论坛利用长期回答用户的提问,来建立自己在行业论坛中的信誉度以及地位,在推广个人的同时,更好的宣传自己的网