无法使用Ctrl-C组合键停止我的Docker容器 [英] Unable to stop my Docker container with Ctrl-C

查看:16
本文介绍了无法使用Ctrl-C组合键停止我的Docker容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Windows 10上使用的是WSL2,使用的是Ubuntu映像,而Docker for Desktop Windows(2.2.2.0)使用的是WSL集成。

我有一台Rust TCP服务器。当我使用cargo run(或cargo install后的二进制文件)运行它时,它会正确地运行,并且我可以向它发送Ctrl-C来终止它。我不在代码中进行任何显式信号处理。

我把它变成了Docker的形象。这是文档文件。

FROM rust:1.40 as builder
COPY . .
RUN cargo install --path . --root .

FROM debian:buster-slim
COPY --from=builder ./bin/myserver ./myserver
EXPOSE 8080
ENTRYPOINT ["./myserver"]

我这样做:

docker build -t myserver .
docker run -it --rm -p 8080:8080 myserver

尝试Ctrl-C进程在终端中显示^C字符,但信号似乎未到达该进程。我要使用docker kill。我也读过thisthis这样的帖子。它建议-it和使用ENTRYPOINTCMD的数组参数版本的组合应该允许信号到达它,但是这些似乎对我没有帮助。

查看是否与我的设置(Docker for Desktop、WSL等)有关或者我的Dockerfile,我遵循docker-http-https-echo的自述文件,并且我能够Ctrl-。检查Dockerfile并没有显示它在做与我不同的事情,但很明显我遗漏了一些东西。

推荐答案

出现问题的原因是内核特别处理了PID1的进程,默认情况下,在收到SIGTERMSIGINT信号时不会终止该进程。

您有两个选项:

  1. docker run命令添加--init标志。这样,将创建一个具有PID1的特殊进程,它将成为您的进程的父进程,并代理所有信号并正确地获取您的进程。
  2. 将显式信号处理添加到您的应用程序,如果您要正常关机,这是很好的选择。

最佳做法是将这两种方法结合起来。

这篇关于无法使用Ctrl-C组合键停止我的Docker容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆