概述
在用docker部署djagno项目时,需要用uwsgi启动django应用并同时启动celery。celery和uwsgi都运行在web容器中。于是写了个脚本打算通过docker-compose的command实现容器启动后自动运行脚本来实现uwsgi和celery的启动
启动脚本start.sh:
#!/bin/bash
uwsgi --ini /featech_v2_0/uwsgi.ini
nohup celery -A celery_tasks.sms.tasks worker -l info >> /featech_v2_0/celery_log/celery.log 2>&1 &
可以看到脚本里面就是简单的两条启动命令
docker-compose.yml
......
web:
#build: .
image: featech_web:v2
container_name: featech_v2_0
#tty: true
command: bash start.sh # 容器运行后自动执行启动脚本
depends_on:
- db
- redis
- mongo
......
然后docker-compose up -d 结果是这样的:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59d07bf9f05c my_docker_nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 8000/tcp featech_nginx
61b4500c5770 featech_web:v2 "bash start.sh" About a minute ago Restarting (0) Less than a second ago featech_v2_0
d19d69f0e090 mysql:5.7 "docker-entrypoint.s…" 30 hours ago Up 24 minutes 33060/tcp, 0.0.0.0:3303->3306/tcp featech_db
可以看到web容器的STATUS是Restarting (0) Less than a second ago。通过docker logs 61b4500c5770未发现问题。于是猜想,docker会不会像我们的代码一样,当函数运行完后,进程就结束了。于是上网查了一下资料,果然:
Docker容器同时只能管理一个进程,如果这个进程退出那么容器也就退出了,但这不表示容器只能运行一个进程(其他进程可在后台运行),但是要使容器不退出必须有一个前台执行的进程。
解决方法:
脚本中最后一个进程一定要用前台运行方式即在进程最后不加&(&表示后台运行),否则容器会退出。
所以我们必须有一个一直在前台运行的进程不让容器退出。在这里我们可以让celery在前台运行,修改start.sh中的celery启动命令,把结尾的&去掉就行了
#!/bin/bash
uwsgi --ini /featech_v2_0/uwsgi.ini
nohup celery -A celery_tasks.sms.tasks worker -l info >> /featech_v2_0/celery_log/celery.log 2>&1 # 去掉了结尾的&
有时候我们可能想要先把容器启动起来然后进入容器查找问题,这是我们可以通过设置docker-compose中的tty:ture来给容器设置一个伪终端。注意:tty和command同事使用时,tty会失效
......
web:
#build: .
image: featech_web:v2
container_name: featech_v2_0
tty: true # 给容器设置一个伪终端防止进程结束容器退出
depends_on:
- db
- redis
- mongo
......
最后
以上就是聪慧紫菜为你收集整理的关于docker一直restart(启动后马上退出)的解决方案的全部内容,希望文章能够帮你解决关于docker一直restart(启动后马上退出)的解决方案所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复