docker为什么不运行同时使用–rm和-d的支持?
Docker的文档说–rm和-d不能一起使用: https ://docs.docker.com/engine/reference/run/#detached-d
为什么? 我似乎误解了“分离”的含义, 它似乎完全正交于–rm做什么。 他们为什么相互排斥?
通过类比,如果我在后台启动进程(例如启动my-service),并且进程退出,进程的资源将自动释放(通过init)。 它不坚持,等待我手动删除它。 为什么docker不允许我将-d和-rm结合起来,这样我的容器就可以以类似的方式工作?
我认为这将解决一个非常常见的用例。 似乎这将很好地避免以下解决方法: https : //thraxil.org/users/anders/posts/2015/11/03/Docker-and-Upstart/
我错过了什么?
因为--rm
是作为客户端选项实现的:当你指定--rm
, --rm
客户端等待容器退出,然后删除它。
当你指定-d
,docker客户端退出 。 容器正在运行,并由Docker服务器进行pipe理。 不再有任何客户--rm
运行来实现--rm
function。
作为回答的一种方式,让我想象我使用-d
和--rm
启动一个容器,这是允许的。 docker run -d --rm --name=my_app my_container
如果我的应用按预期工作,它就会运行,当它到了死亡的时候,它就会死亡,并悄悄地移除,这意味着我可以用一点麻烦重新运行这个命令。 这似乎是理想的,你的问题是我为自己的项目设置了一些docker自动化的时候遇到的一个问题。
但是,如果出现问题,容器中运行的进程会遇到致命的错误并崩溃,导致容器死亡。 问题是,对于任何外部的观察者,无论是人类还是监控软件,都不能分辨出这两种情况的区别,除了容器有多长时间以外。
在不使用-d的情况下,在CLI中运行命令或使用upstart / initd / systemd / other,容器将写入输出,即使给出容器,该容器也将保留--rm
,从而允许发现错误或崩溃并解决。
在使用-d
情况下,不将容器输出绑定到任何输出stream或文件,– --rm
不允许确保有遗留的证据(以死容器的forms)存在错误/崩溃。
包装/ TL; DR:我相信这个有意识的select是由docker开发人员做的,以防止容器被完全不计算的情况下,权衡是需要添加两个更多的命令到您的自动化脚本。
从版本1.13开始,您现在可以使用--rm
后台作业。 删除操作已从客户端移动到服务器以启用此操作。
有关更多详细信息,请参阅以下pull请求: https : //github.com/docker/docker/pull/20848
这是一个新的行为的例子:
$ 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
- Selenium节点泊坞窗图像NODE_MAX_SESSION和NODE_MAX_INSTANCES envvariables
- Docker组成每个networking添加本地IP地址
- 在centos7上安装docker后,无法启动docker。“docker.service的Job失败。
- 图kafka hostPort映射
- Docker:Dockerfile与docker-compose.yml
- GitLab CI审查环境与docker工人
- 如何使用docker创build运行docker的最小的live ISO?
- 来自守护进程的错误响应:获取https:// xxxx / v1 / users /:x509:由未知权限签名的证书
- 用不同端口的nginx和docker容器实现反向代理