PID 1在docker持久性

我已经build立了一个Kippo服务器在docker容器中运行。 一切运行良好,直到你杀了容器。 杀死容器(通过重新启动机器或通过docker kill)使其无法使用STDERR“另一个扭曲的服务器正在运行,PID 1”。 我怎么解决这个问题? 我没有问题来重置容器的文件系统或类似的东西,因为我想要的一切都logging到数据库。 非常感谢你

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

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

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

我希望这个对你有用!

这听起来像是你的pid1在容器中被告知停止后没有正确清理。 这可能意味着它不会删除它的pid文件,所以当你再次启动容器时,它拒绝启动。

处理这个问题的一种方法是引入像supervisord这样的处理接收停止信号的东西,然后正常closureskippo服务器。

另一种解决scheme可能是以只读模式启动容器。 在只读模式下,容器不会获得写入层,而根文件系统只是只读的。 但是,如果Kippo不能创build一个pid文件,它可能会拒绝启动。 (请参阅docker run --read-only

另一个解决scheme是设置一个ENTRYPOINT脚本,在调用kippo上的exec之前删除pidfile。