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。