如何退出Docker容器内运行的命令 解决Ctrl+C无法终止进程问题
问题根因
Ctrl+C触发的SIGINT信号无法生效,本质是Linux内核的信号传递规则限制:PID为1的进程默认不会接收SIGINT、SIGTERM等终止信号,除非进程主动注册了对应信号的处理逻辑。你运行命令时assetic:watch是容器内的PID1进程,本身没有内置SIGINT处理逻辑,所以无法响应Ctrl+C操作。
可用解决方案
- 方案1:临时加
--init参数运行
不需要修改镜像,直接在运行命令中添加--init参数,Docker会自动在容器内启动轻量init进程作为PID1负责信号转发,修改后命令如下:docker run -ti --init build-tool:latest ./bin/console assetic:watch - 方案2:修改Dockerfile启动指令
如果你是用shell形式定义CMD/ENTRYPOINT(比如CMD ./bin/console assetic:watch),系统会默认用shell作为PID1拦截信号,改成exec数组形式即可:CMD ["./bin/console", "assetic:watch"] - 方案3:镜像内置tini init进程
适合需要多次运行该类命令的场景,直接在镜像中内置轻量init进程tini,示例Dockerfile配置:
构建镜像后运行容器不需要额外参数,tini会自动转发所有信号给子进程。# 基于Debian/Ubuntu基础镜像的配置 RUN apt-get update && apt-get install -y --no-install-recommends tini \ && rm -rf /var/lib/apt/lists/* ENTRYPOINT ["/usr/bin/tini", "--"] - 如果你使用docker-compose编排,直接在对应服务的配置中增加
init: true即可实现和--init参数一样的效果。
内容的提问来源于stack exchange,提问作者oligofren
相关产品推荐
相关产品推荐

