1. 问题描述
使用docker run启动一个beego服务,命令为:
1 | docker run --name bservice -d -p 8080:8080 voidking/bservice:v1 "/bin/bash" "-c" "cd /opt/bservice && nohup ./bservice" |
启动后,beego服务是容器内PID为1的前台进程。假设该服务不是那么健壮,出了bug会停止服务,那么容器也会随之停止。
如果想要服务停止后自动启动,那么就需要supervisor出马了。
2. 解决方案
参考《CentOS安装配置Supervisor》,在容器中安装supervisor。
1、在/etc/supervisor中新建bservice.conf文件
1 | [program:bservice] |
2、测试启动
1 | systemctl retart supervisord |
3、编辑/etc/supervisord.conf,设置supervisor为前台进程
1 | nodaemon=true |
4、把容器保存为镜像
1 | docker commit container_id voidking/bservice:v2 |
5、修改启动命令为
1 | docker run --name bservice -d -p 8080:8080 voidking/bservice:v2 "/bin/bash" "-c" "supervisord -c /etc/supervisord.conf" |
使用这种启动方式,哪怕服务因为意外停止,也会马上被supervisor拉起,提高了服务的可用性。
3. 扩展应用
再来看另外一个场景:npm run start
原本可以正常启动node服务进入后台运行,容器化后通过docker run启动,命令为:
1 | docker run --name fservice -d -p 80:80 voidking/fservice:v1 "/bin/bash" "-c" "cd /opt/fservice && npm run start" |
尴尬的是,容器启动后就会自动退出,这是因为容器运行必须要一个前台进程。因此一个简单的解决办法是修改启动命令,添加tail -f:
1 | docker run --name fservice -d -p 80:80 voidking/fservice:v1 "/bin/bash" "-c" "cd /opt/fservice && npm run start > ./start.log && tail -f ./start.log" |
但是,更好的办法还是使用supervisor进行node服务的管理。同样需要在容器中安装supervisor,然后进行配置。
1、在/etc/supervisor中新建fservice.conf文件
1 | [program:fservice] |
2、测试启动
1 | systemctl retart supervisord |
3、编辑/etc/supervisord.conf,设置supervisor为前台进程
1 | nodaemon=true |
4、把容器保存为镜像
1 | docker commit container_id voidking/fservice:v2 |
5、修改启动命令为
1 | docker run --name bservice -d -p 8080:8080 voidking/fservice:v2 "/bin/bash" "-c" "supervisord -c /etc/supervisord.conf" |