详解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


猜你喜欢
- 已经了解了如何生成和添加广告代码,现在您关心的问题可能就是:怎么投放广告才能有更多的广告收入呢?下面我们就为您揭开提升网站广告收益的几大秘技
- 现阶段中国B2C虽然很火爆,但鲜有有规模盈利成功的例子,说B2C全行业亏损一点也不过分。开个小店几百万销售有盈利的可能,但反而上规模的B2C
- 前言:新上一台阿里的云主机,提供web服务,各种环境搭建完成,能够提供服务,没想到在最后的监控环节遇到各种发邮件的坑,这里分享给大家,你是否
- 第一步:登录Godaddy控制面板,在面板左边选择自己的主机列表,点击进入列表页面:第二步,在列表中选择你要变更的主机,并点击,在右边出现后
- 很多朋友想建ftp服务器在Internet上共享自己的资源,苦于没有公网IP,无法实现。其实,内网IP也可以建ftp服务器的。第一步:首先当
- 10月12日消息,据国外媒体报道,互联网用户管理机构ViziSense最新数据显示,谷歌Gmail已经超越雅虎,成为印度最受欢迎的电子邮件服
- 搜索引擎是不断地在发展,所以规律也在不停地变化,需要随时跟踪搜索引擎的新动态。这里整理了200个搜索引擎算法的相关因素,好东西啊!1. 关键
- 影响网站可信度的因素表现在多个方面,从大的方面来说,比如网站/企业的知名度、网站的功能和服务等,从小的方面来说,有很多细节问题都会或多或少影
- 2007年一月底,千呼万唤的Windows Vista隆重上市,同时微软服务器家族的下一力作,Longhorn Server也一步步向我们走
- 众所周知,QQ空间的人气很高,那作为站长的我们能否利用QQ的高人气呢?答案是肯定的!虽然QQ空间带来的反链效果很差,但带来的流量却相当可观!
- AIR(全名Adobe Integrated Runtime,前身Apollo)的来意 这几年企业应用系统慢慢己从窗口桌面转移到网页平台上,
- 康盛的系列产品,包括Discuz、UCHome、Supesite都集成了同一个用户系统——UCenter,用户登录的密码也保存在UCente
- linux systemd什么是 systemdLinux 系统在启动过程中,内核完成初始化以后,由内核第一个启动的程序便是 init 程序
- 如何解决VMWare中Ubuntu重启后无法上网,具体如下原因:没有设置静态的DNS,导致系统每次重启都会把先前设置的DNS删除。重启后无法
- 北京时间11月13日消息,据国外媒体报道,Kershaw, Cutter & Ratinoff律师事务所在其网站上称,正在寻找&am
- 网上搜出来的比较乱,讲的不明不白,因此根据自己弄过一次,确认可行的方式,做个备份,方便日后查阅。环境:在Oracle VM VirtualB
- 网络经过这么多年几次锤炼,网站和站长意识根据网民的要求与自身发展也在改变,也应该要改变!互联网网民的素质有这么几个过程A:好奇,什么网站都去
- 地方门户网站在互联网世界里方兴未艾,各个地方的门户网站“你方唱罢我登场”。最初是省级、市级的地方门户
- 现在,一些网站推出了G容量的免费邮箱,引来许多网友纷纷注册使用。实际上,我们利用自己的服务器,使用任何一款邮件服务器软件,就能架设千兆甚至万
- 木马是一种基于远程控制的病毒程序,该程序具有很强的隐蔽性和危害性,它可以在人不知鬼不觉的状态下控制你或者监视你。有人说,既然木马这么厉害,那