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

2025-05-27 0 49

本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。

docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。

比如 docker hello-world

?

1

2

3

4
# 一闪而过 输出一堆东西

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 系统小容器,让其可以常驻运行,以便我们登录交互执行某些命令。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
# 使用 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

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

?

1

2

3

4
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

?

1

2

3
# 后续停止/启动容器时就不需要在指定 -it 参数了

docker stop alpine

docker start alpine

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

?

1

2

3

4
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

?

1

2

3

4

5

6

7

8

9

10
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

创建容器 & 登入容器

?

1

2

3
docker-compose up -d big_cat_alpine ./

docker ps

docker exec -it big_cat_alpine sh

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

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

原文链接:https://segmentfault.com/a/1190000017967660

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 行业资讯 详解docker 容器不自动退出结束运行的方法 https://www.kuaiidc.com/67814.html

相关文章

发表评论
暂无评论