例如我跑
docker run --rm --name mycontainer -p 8080:8080 myrepo/myimage
然后我看到我的应用程序的输出,一切正常。然后我按 Ctrl+C 但容器仍在运行,我被迫明确停止并删除它:
docker rm -f <container_id>
或者更糟:
docker stop <container_id>
docker rm <container_id>
有什么办法可以自动完成吗?如果没有也没关系。
PS:所有停止的容器仍然保留在硬盘上的目的是什么?!
最佳答案
What is the purpose of all that stopped containers still kept on the harddrive?!
运行容器包括您正在运行的进程以及命名空间环境以在(网络、pid、文件系统等)内部运行该进程。
停止的容器具有特定于容器的读/写文件系统层、您为运行容器而包含的任何配置(例如环境变量),以及如果您使用 json 日志驱动程序(默认)的日志。
删除容器会删除该 RW 文件系统层、json 日志和配置,这也会从已停止的容器列表中删除该容器。这是一项永久性操作,因此请勿移除您可能希望稍后检查或重新启动的容器。
I press the Ctrl+C but the container is still running and I'm forced to explicitly stop and remove it
首先,确保您运行的是当前版本的 docker。我相信在 1.13 左右,他们迁移了
--rm
的处理过程。从客户端到服务器的选项。接下来,确保您的应用程序处理 Ctrl+C 命令。在 shell 脚本中,这将是 SIGTERM
的处理程序。 .您还需要以交互方式运行容器,以便将键盘输入发送到容器,即 -it
旗帜。完成所有这三个操作后,您应该会看到容器自动清理:docker run --rm -it --name mycontainer -p 8080:8080 myrepo/myimage
然后是 Ctrl+C。
-it
将通过 SIGTERM
到应该停止进程的容器,这会停止正在运行的容器。和 --rm
将导致容器被自动删除。如果由于某种原因您无法让容器处理
SIGTERM
,然后您可以发送 SIGKILL
与 docker kill
命令,不能被应用程序捕获和忽略。请注意,如果您运行
docker stop
在您的容器上看到它停止前有 10 秒的延迟,那么您的应用程序忽略了 SIGTERM
.造成这种情况的一个常见原因是 /bin/sh
以 pid 1 运行。假设您处于信号用户模式,shell 将默认以 pid 1 运行时忽略此信号。
关于docker - 如何在终端/gitbash/powershell/等中按Ctrl+C自动停止和删除Docker容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48008260/