使用 docker 是很方便,有的时候掉进去,却找不到原因。使用 docker-compose 对服务进行编排是一个很常见的场景。当执行 docker-compose up -d 的时候,无论是服务端代码,还是配置代码,都是正确的,日志也是正确的。可是容器总是会 Exited 状态。这个时候就很着急。其实,容器退出的原因一般是因为错误和不在前台运行导致的。既然没有错误,那估计就是容器没在前台运行。
今天使用 alpine 为基础镜像,安装一个 supervisord 作为守护进程,然后就是自己的业务环境 skynet 和 skynet 的业务代码。当以前都配置的很好,编写的很好,状态也很好的时候。容器就是退出。这个是一个很痛苦的事情。其实,还是对容器退出没理解透彻。
下边是启动时候,打印的一些日志。
nanjing_dev | NanjingDevServer STARTING
nanjing_dev | NanjingDevServer RUNNING pid 14, uptime 0:00:50
nanjing_dev | Proto Recv-Q Send-Q Local Address Foreign Address State
nanjing_dev | tcp 0 0 127.0.0.11:33351 0.0.0.0:* LISTEN
nanjing_dev | tcp 0 0 0.0.0.0:8105 0.0.0.0:* LISTEN
nanjing_dev | udp 0 0 127.0.0.11:36173 0.0.0.0:*
没有任何错误。错误就在容器没有在前台运行。因为服务是用 supervisord 来启动的。让 supervisord 在前台运行不就好了。这个时候只需要修改 supervisor_xxx.ini 的配置文件,将启动方式改为前台即可。
[supervisord]
nodaemon=true
就是 nodaemon 设置为 true。 默认是 false 哈。