今天做redis单机版本的docker化安装,遇到一个很奇怪的问题:
用yaml文件启动容器后,pod一直在restart,最后直接crash掉了,看日志并没有报任何错误,启动脚本是自己写了一个shell,然后shell里调redis启动脚本。
各种修改尝试问题依然在,后来发现启动shell中加一段死循环pod就能正常running,初步怀疑是因为启动shell运行结束导致pod认为容器已经down掉,后来把redis设置成前台启动也能解决问题,断定问题出在进程上。
今天翻阅了<第一本Docker书>,书中描述:docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉,之前出现的问题应该是shell脚本已经执行完毕,而redis服务又设置成了后台运行。
解决方法:
1.最佳的解决方案是,将你要在容器里运行的程序以前台进程的形式运行,当然,如果你的容器需要同时启动多个进程,
那么也只需要,或者说只能将其中一个挂起到前台即可。
2.对于有一些你可能不知道怎么前台运行的程序,提供一个投机方案,你只需要在你启动的命令之后,
添加类似于 tail top 这种可以前台运行的程序,这里特别推荐 tail ,然后持续输出你的log文件。