如何在一个容器中运行 Flask 和 celery?

chi*_*ifu 1 python celery flask docker

我想在 digitalocean 上使用 docker 部署我的小 Web 应用程序。问题是,我没有分开 Flask + celery,所以所有东西都在一个容器中。\n每次我运行docker-compose upWeb 容器都会崩溃(“以代码 0 退出”)。

\n\n

项目结构如下:

\n\n
.\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nginx\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dockerfile\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nginx.conf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 web\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.ini\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bot\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __pycache__\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 timer.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 celeryd.pid\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dockerfile\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dockerignore\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 flask_app.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tasks.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 webapp\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bot\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __pycache__\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 static\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 users\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 docker-compose.yml:

\n\n
.\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nginx\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dockerfile\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nginx.conf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 web\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.ini\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bot\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __pycache__\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 timer.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 celeryd.pid\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dockerfile\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dockerignore\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 flask_app.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tasks.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 webapp\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bot\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __pycache__\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 static\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 users\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我评论"command: celery -A tasks.celery worker --loglevel=info --detach" 一切都运行得很好,因为芹菜没有运行。网页功能齐全,数据库处于活动状态。一切都很好,除了芹菜。

\n\n

通过取消注释命令行,docker 会抛出“web exited with error code 0”。

\n\n

我猜这是因为 docker 在成功执行命令后退出了容器。所以我面临两个问题:

\n\n

1)如何在同一个celery容器的后台运行celery,这样就不会出现错误代码0?

\n\n

2)如何在容器中并行运行芹菜和烧瓶?

\n\n

-> 我已经尝试过以下操作,但出现同样的错误:

\n\n
command: bash -c "uwsgi app.ini && celery -A tasks.celery worker --loglevel=info --detach"\n
Run Code Online (Sandbox Code Playgroud)\n\n

非常感谢任何帮助:)

\n\n

编辑: \n我将芹菜+烧瓶放在一个容器中的原因是我的task.py。在这里,我从 web.webapp.models 导入所有 sqlalchemy 模型。所以我需要访问 Flask 目录,目前我没有看到如何将其分成两个容器的方法

\n

Dav*_*aze 5

如果您需要在两个不同进程之间“共享”的唯一内容是代码,那么它已经存在于构建的 Docker 映像中。您可以非常轻松地在同一个映像上运行两个不同的容器,但使用不同的命令。

services:
  web:
    build: ./web  
    environment:    
      FLASK_DEBUG: 'True'
      FLASK_APP: 'flask_app.py'
    command: flask run --host=0.0.0.0
    depends_on:     
      - nginx
      - db
      - rabbitmq
  celery:
    build: ./web  
    restart: always
    command: celery -A tasks.celery worker --loglevel=info
    depends_on:     
      - db
      - rabbitmq
Run Code Online (Sandbox Code Playgroud)

请注意,两者build:是相同的图像。另外,我没有让它celery worker作为--detach前台进程运行;只要容器command:仍在运行,容器就会保持运行。

(要使该片段在原始文件的上下文中工作,docker-compose.yml您需要彻底删除networks:整个文件中的所有块,但它会正常工作:Docker Compose 创建一个默认网络,并使用名称将所有服务附加到它他们的服务块。我还删除了许多其他无关紧要的选项。)