Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单个docker容器中运行crontab服务和wsgi正确吗_Python_Django_Docker - Fatal编程技术网

Python 在单个docker容器中运行crontab服务和wsgi正确吗

Python 在单个docker容器中运行crontab服务和wsgi正确吗,python,django,docker,Python,Django,Docker,目前,我有一个Django wsgi来处理web流量。(我有一个nginx作为前端,将流量转发到wsgi) 现在,我想启动一个crobtab服务,运行定期后台作业 这就是我所做的 django\Dockerfile django\entrypoint.sh docker-compose.yml 如果我使用上述设置,我会注意到 我的schedule cron worker定期运行 但是,wsgi无法为web流量提供服务 首先,我尝试在django\entrypoint.sh # start c

目前,我有一个Django wsgi来处理web流量。(我有一个nginx作为前端,将流量转发到wsgi)

现在,我想启动一个crobtab服务,运行定期后台作业

这就是我所做的


django\Dockerfile django\entrypoint.sh docker-compose.yml
如果我使用上述设置,我会注意到

  • 我的schedule cron worker定期运行
  • 但是,wsgi无法为web流量提供服务
  • 首先,我尝试在
    django\entrypoint.sh

    # start cron
    /usr/sbin/crond -f -l 8
    

    做了上述修改后,

  • 我的schedule cron worker不再运行。不知道为什么
  • wsgi可以服务于web流量

  • 我可以知道为什么会这样吗?如何使我的
    django
    容器服务于web流量,同时运行cron作业


    或者,这不是在Docker做这件事的正确方式吗?我应该使用两个容器?

    我会在第二个容器上运行一个完整的容器,在compose file
    cron
    或类似文件中命名服务(如果您有多个cron,可能更具体到实际作业)。一般情况下,每个容器1个过程。在“cron”容器中,我甚至不会通过
    crond
    运行它,我会在主机上使用任何东西来处理容器的调度。我会将您的工作从一个
    django cron
    更改为一个自定义的
    django admin
    命令,因为您将不再使用django应用程序来管理它的运行。您仍然可以使用django one映像构建第二个容器,只需使用
    docker compose.yml
    文件
    命令:[“django admin”,“mycommand”]
    更改
    CMD
    。可能没有必要暴露第二个容器上的端口。作为一个普通服务调用
    docker compose run mycronservice

    我会在compose文件
    cron
    或类似文件中运行一个完整的第二个容器来命名服务(如果您有多个cron,可能更具体到实际的作业)。一般情况下,每个容器1个过程。在“cron”容器中,我甚至不会通过
    crond
    运行它,我会在主机上使用任何东西来处理容器的调度。我会将您的工作从一个
    django cron
    更改为一个自定义的
    django admin
    命令,因为您将不再使用django应用程序来管理它的运行。您仍然可以使用django one映像构建第二个容器,只需使用
    docker compose.yml
    文件
    命令:[“django admin”,“mycommand”]
    更改
    CMD
    。可能没有必要暴露第二个容器上的端口。作为普通服务调用
    docker compose运行mycronservice

    #!/bin/sh
    
    ...
    
    python manage.py crontab add
    
    # https://stackoverflow.com/questions/37015624/how-to-run-a-cron-job-inside-a-docker-container
    #
    # "crond -help" yields:
    #
    # -f      Foreground
    # -b      Background (default)
    # -S      Log to syslog (default)
    # -l N    Set log level. Most verbose:0, default:8
    # -d N    Set log level, log to stderr
    # -L FILE Log to FILE
    # -c DIR  Cron dir. Default:/var/spool/cron/crontabs
    
    # start cron
    /usr/sbin/crond -f -l 8
    
    exec "$@"
    
      django:
        build:
          context: ./django
          dockerfile: Dockerfile
        restart: always  
        depends_on:
          - pgbouncer
        expose:
          - "5000"
        volumes:
          - static_data:/app/static
    
    # start cron
    /usr/sbin/crond -f -l 8
    
    # start cron
    /usr/sbin/crond -b -l 8