docker-compose up -d启动容器仍退出 分离/非分离容器演示问题
问题原因
你对-d参数的作用存在认知偏差:
-d(分离模式)仅控制docker-compose命令自身的运行行为:不加-d时,docker-compose启动容器后会留在前台,持续打印容器日志,直到容器退出才返回终端控制权;加-d时,docker-compose完成容器启动动作后就直接退回终端,不会占用前台会话。- 这个参数完全不决定容器会不会持续运行。容器的生命周期完全和它的1号主进程(PID 1)绑定:只要主进程执行完毕退出,无论你用什么模式启动,容器都会立刻进入退出状态。
你当前的配置没有给容器指定任何常驻运行的前台任务:基于alpine:3.14镜像启动时,默认执行的主进程是/bin/sh,这个进程在没有绑定交互终端、没有待执行持续任务的情况下,启动后会立刻运行结束并返回退出码0,因此不管加不加-d,容器都会秒退。
正确演示方法
要演示两种启动模式的差异,首先要让容器的主进程保持常驻,不会自动退出。最简单的调整方式是修改docker-compose.yml,给服务添加tty: true配置,给容器分配持久化的伪终端,让默认启动的sh进程进入交互等待状态,不会立刻退出:
version: "3.9" # Define services services: container1: container_name: first_container build: context: . dockerfile: dockerfile tty: true
修改完成后先执行docker-compose down清理之前残留的退出容器,再按以下步骤演示:
- 前台模式效果演示
执行docker-compose up,当前终端会被docker-compose占用,持续附着在容器的输出流上。此时新开一个终端窗口执行docker-compose ps,可以看到容器处于Up运行状态。在原启动窗口按Ctrl+C终止前台docker-compose进程,容器会同步被停止,再次查询状态会显示为退出状态,退出状态的容器无法执行attach操作接入。 - 分离模式效果演示
执行docker-compose up -d,命令跑完会直接返回终端提示符,不会占用当前会话。执行docker-compose ps查询,会看到容器始终保持Up运行状态。
此时执行docker-compose attach first_container,就能直接接入容器内的sh终端,可以正常输入执行命令;按快捷键Ctrl+P+Ctrl+Q可以从容器会话中分离回到宿主机终端,容器会继续在后台保持运行,不会退出。
内容的提问来源于stack exchange,提问作者AaronJPung
相关产品推荐
相关产品推荐

