Docker持久性中的PID 1

Docker持久性中的PID 1,docker,containers,twisted,pid,Docker,Containers,Twisted,Pid,我已经设置了一个Kippo服务器在docker容器中运行。一切正常,直到你杀死了容器。终止容器(通过重新启动机器或通过docker kill)使其无法与STDERR“另一个twistd服务器正在运行,PID 1”一起使用。我怎样才能解决这个问题?我没有问题重置容器的文件系统或类似的东西,因为我想要的一切都记录到数据库中。非常感谢当您的pid1被告知停止时,容器中的pid1似乎没有正确清理。这可能意味着它不会删除其PID文件,因此当您再次启动容器时,它会拒绝启动 处理这个问题的一种方法可能是引入类

我已经设置了一个Kippo服务器在docker容器中运行。一切正常,直到你杀死了容器。终止容器(通过重新启动机器或通过docker kill)使其无法与STDERR“另一个twistd服务器正在运行,PID 1”一起使用。我怎样才能解决这个问题?我没有问题重置容器的文件系统或类似的东西,因为我想要的一切都记录到数据库中。非常感谢

当您的pid1被告知停止时,容器中的pid1似乎没有正确清理。这可能意味着它不会删除其PID文件,因此当您再次启动容器时,它会拒绝启动

处理这个问题的一种方法可能是引入类似supervisord的东西,它可以处理停止信号的接收,然后优雅地关闭kippo服务器

另一种解决方案可能是简单地以只读模式启动容器。在只读模式下,容器没有写入层,根文件系统只是只读的。然而,Kippo可能会拒绝启动,如果它不能创建一个pidfile开始。(请参见
docker run--只读


另一个解决方案是设置一个入口点脚本,在kippo上调用exec之前删除PID文件。

在Docker中,每个容器都在其自己的PID命名空间中运行。这意味着dockerfile启动的进程将始终为PID 1,并且PID将从此处向上计数

twistd
期望PID具有足够的不确定性,它可以通过简单比较查看PID是否相同来检查另一个
twistd
是否“已经运行”。因为在Docker中,PID始终为1,所以此检查始终成功,
twistd
认为它不应该启动。如果容器不干净地退出,
twistd
将没有机会清理其
.pid
文件,并且状态将保留在容器的文件系统中

由于Docker守护进程将命名容器并阻止两个匹配的
twistd
进程同时启动,因此
.pid
文件及其相关检查实际上根本没有用处,因此您应该禁用它。您可以通过更改命令行以在插件名称之前包含
--pidfile=
选项(与此完全相同,在“
=
”)之后没有任何内容)来禁用它。我不熟悉Kippo,但是对于
twistd-web
,这将是
twistd-pidfile=web


我希望这有帮助

我已经指定了一个pidfile,如果出现问题,它将被删除。我的问题是,在杀死容器(而不是停止它)后,twistd有问题,而不是kippo。既然kippo穿过twistd,kippo就跑不动了。我是否可以删除所有pid文件,然后容器作为一个全新的容器启动?按照我在回答中描述的方式更改运行kippo的
twistd
命令行,这样就不需要删除pid文件,因为它们既不会被写入也不会被检查。很高兴听到这个消息-感谢您的关注,也感谢您使用Twisted!Kippo不会以只读模式运行,因为必须生成一些键。我会尽量在大楼里提供。另外,我不认为kippo.pid是问题所在,因为如果它已经存在,它会被删除。在哪里可以找到twistd文件?