千家信息网

详解docker 容器不自动退出结束运行的方法

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。docker 容器的生命周期是同容器中的前置进
千家信息网最后更新 2025年12月01日详解docker 容器不自动退出结束运行的方法

本文主要简单介绍 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_sldocker images# 有账号的话发布到 docker hub 上去docker push big_cat/alpine_sl

# 后续停止/启动容器时就不需要在指定 -it 参数了docker stop alpinedocker start alpine

提交容器变更生成新的镜像

docker commit -m "alpine with sl cmd" -a "big_cat" alpine big_cat/alpine_sldocker 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 psdocker exec -it big_cat_alpine sh

通过 docker-compose 将那两个参数传入进去,编排后启动服务容器。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

容器 镜像 进程 运行 命令 参数 系统 终端 生成 优雅 基础 账号 服务 方法 粗陋 纯净 一闪而过 没关系 东西 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华为服务器共享文件夹 特斯拉的数据库有没有传回美国 网络安全短片中学生 百川考试正在初始化数据库 德州移动城管软件开发系统 泰州idc服务器厂商 九江企业服务器费用多少 张家口学习软件开发 qq空间相册服务器出错什么意思 长沙驿通网络技术有限公司 按键精灵服务器失灵 数据库原理与运用课程设计 excel数据库引擎 信息系统的网络安全一共分为几级 数据库 监听 分布式数据库缓存一致性怎么解决 怎么用数据库怎么找到网站 会计从业继续教育网络安全测试 网络安全儿歌 八句 应对船舶网络安全问题的解决方法 大兴区软件开发概况 泾川县网络安全检查 安全手抄报网络安全大全 华为网络技术大赛复赛答辩 dhcp服务器的作用是 华南理工许勇网络安全 小型服务器构造 对英大人寿数据库的理解 北约网络安全组织 服务器光盘怎么安装系统
0