如何在终端/gitbash/powershell/等中按Ctrl+C自动停止和删除Docker容器?

ieX*_*ept 6 docker

例如我跑

docker run --rm --name mycontainer -p 8080:8080 myrepo/myimage
Run Code Online (Sandbox Code Playgroud)

然后我看到我的应用程序的输出,一切正常。然后我按Ctrl+C但容器仍在运行,我被迫明确停止并删除它:

docker rm -f <container_id>
Run Code Online (Sandbox Code Playgroud)

或者更糟:

docker stop <container_id>
docker rm <container_id>
Run Code Online (Sandbox Code Playgroud)

有什么办法可以自动完成吗?如果没有也没关系。

PS:所有停止的容器仍然保留在硬盘上的目的是什么?!

BMi*_*tch 5

所有停止的容器仍然保留在硬盘上的目的是什么?!

运行容器包括您正在运行的进程以及命名空间环境以在(网络、pid、文件系统等)内部运行该进程。

停止的容器具有容器特定的读/写文件系统层、您为运行容器而包含的任何配置(例如环境变量),以及如果您使用 json 日志驱动程序(默认)的日志。

删除容器会删除该 RW 文件系统层、json 日志和配置,这也会从已停止的容器列表中删除该容器。这是一项永久性操作,因此请勿移除您可能希望稍后检查或重新启动的容器。

我按下Ctrl+C但容器仍在运行,我被迫明确停止并删除它

首先,确保您运行的是当前版本的 docker。我相信在 1.13 左右,他们将--rm选项的处理从客户端迁移到了服务器。接下来,确保您的应用程序处理Ctrl+C命令。在 shell 脚本中,这将是SIGTERM. 您还需要以交互方式运行容器,以便将键盘输入发送到容器,即-it标志。完成所有这三个操作后,您应该会看到容器自动清理:

docker run --rm -it --name mycontainer -p 8080:8080 myrepo/myimage
Run Code Online (Sandbox Code Playgroud)

后跟一个Ctrl+ C。该-it会通过SIGTERM对容器然后应停止过程,停止正在运行的容器。并且--rm会导致容器被自动移除。

如果由于某种原因您无法让您的容器处理SIGTERM,那么您可以发送SIGKILL带有docker kill命令的 ,该命令不会被应用程序捕获和忽略。

请注意,如果您docker stop在容器上运行 a并在停止之前看到 10 秒的延迟,那么您的应用程序将忽略SIGTERM. 造成这种情况的一个常见原因是/bin/sh作为 pid 1 运行。假设您处于信号用户模式,shell 在默认情况下作为 pid 1 运行时将忽略此信号。