例如我跑
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:所有停止的容器仍然保留在硬盘上的目的是什么?!
所有停止的容器仍然保留在硬盘上的目的是什么?!
运行容器包括您正在运行的进程以及命名空间环境以在(网络、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 运行时将忽略此信号。
| 归档时间: |
|
| 查看次数: |
1835 次 |
| 最近记录: |