我是靠谱客的博主 聪慧紫菜,最近开发中收集的这篇文章主要介绍关于docker一直restart(启动后马上退出)的解决方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在用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(启动后马上退出)的解决方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部