Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';docker是否同时使用--rm和-d运行支持?_Docker - Fatal编程技术网

为什么';docker是否同时使用--rm和-d运行支持?

为什么';docker是否同时使用--rm和-d运行支持?,docker,Docker,Docker的文档说明--rm和-d不能一起使用: 为什么??我似乎误解了“超脱”的含义;它似乎与rm所做的完全正交。为什么它们相互排斥 以此类推,如果我在后台启动一个进程(例如启动我的服务),并且该进程退出,那么该进程的资源将自动释放(通过init)。它不会粘在周围,等待我手动移除它。为什么docker不允许我将-d与--rm结合起来,以便我的容器以类似的方式工作 我认为这将解决一个非常常见的用例。似乎这将很好地避免以下工作: 我遗漏了什么?作为一种回答方式,让我们假设我使用-d和-rm启动一

Docker的文档说明--rm和-d不能一起使用:

为什么??我似乎误解了“超脱”的含义;它似乎与rm所做的完全正交。为什么它们相互排斥

以此类推,如果我在后台启动一个进程(例如启动我的服务),并且该进程退出,那么该进程的资源将自动释放(通过init)。它不会粘在周围,等待我手动移除它。为什么docker不允许我将-d与--rm结合起来,以便我的容器以类似的方式工作

我认为这将解决一个非常常见的用例。似乎这将很好地避免以下工作:


我遗漏了什么?

作为一种回答方式,让我们假设我使用
-d
-rm
启动一个容器,这是允许的
docker run-d--rm--name=my_应用程序my_容器

如果我的应用程序按预期工作,它将运行,当它死掉时,它会死掉并自动删除,这意味着我可以轻松地重新运行这个命令。这看起来很理想,你的问题是我在为我的项目设置docker自动化时遇到的

但是,如果出现问题,容器中运行的进程遇到致命错误并崩溃,导致容器死亡,该怎么办。问题是,对于任何外部观察者,无论是人类还是监控软件,都无法分辨这两种情况之间的区别,除了容器的存活时间

在不使用-d的情况下,在CLI中运行命令或使用upstart/initd/systemd/other,容器会写入输出,即使容器被给定
--rm
,输出也会保持不变,从而允许注意并解决错误或崩溃

在使用
-d
的情况下,不允许将容器输出绑定到任何输出流或文件,
--rm
以确保以死容器的形式留下错误/崩溃的证据

进行总结/TL;DR:我相信docker开发人员做出了这一有意识的选择,以防止容器完全下落不明的情况发生,其代价是需要向自动化脚本中添加两个以上的命令。

因为
--rm
是作为客户端选项实现的:当您指定
--rm
时,docker客户端等待容器退出,然后将其删除


指定
-d
时,docker客户端将退出。容器正在运行,由Docker服务器管理。不再有任何客户端运行以实现
--rm
功能。

从1.13版开始,您现在可以将
--rm
用于后台作业。已将删除操作从客户端移动到服务器以启用此功能

有关更多详细信息,请参阅以下拉动请求:

以下是这种新行为的一个示例:

$ docker run -d --rm --name sleep busybox sleep 10
be943302d668f6416b083b8b6fa74e254b8e4200d14f6d7743d48691db1a4b18

$ docker ps | grep sleep
be943302d668        busybox             "sleep 10"               4 seconds ago       Up 3 seconds                                 sleep

$ sleep 10; docker ps | grep sleep

请注意,docker 1.12中可能会改变这一点;有一个openpull请求将删除移动到守护进程;