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

标签 docker

例如我跑

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 ,然后您可以发送 SIGKILLdocker 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/

相关文章:

docker - 无法访问安装在容器中的Jenkins

java - 如何在 VSCode IDE 中为 JRE 使用 docker 容器?

docker - 如何在声明性 Jenkins 管道中将 secret 文件挂载到 docker 镜像中?

nginx - Ghost 和 nginx 代理出现 docker-compose 错误

docker - 无法远程登录到MariaDB容器

docker - 结束连接时出现错误,Gitlab ci 退出 lftp 命令

docker - SageMaker 部署错误 "serve"在 $PATH 中找不到可执行文件

docker - 如何检查 Docker 的重启策略是否有效

java - 使用 Java 连接到 Docker 上的多节点 Couchbase 集群

linux - docker compose 中的 secret