chi*_*ifu 1 python celery flask docker
我想在 digitalocean 上使用 docker 部署我的小 Web 应用程序。问题是,我没有分开 Flask + celery,所以所有东西都在一个容器中。\n每次我运行docker-compose upWeb 容器都会崩溃(“以代码 0 退出”)。
项目结构如下:
\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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n如果我评论"command: celery -A tasks.celery worker --loglevel=info --detach" 一切都运行得很好,因为芹菜没有运行。网页功能齐全,数据库处于活动状态。一切都很好,除了芹菜。
通过取消注释命令行,docker 会抛出“web exited with error code 0”。
\n\n我猜这是因为 docker 在成功执行命令后退出了容器。所以我面临两个问题:
\n\n1)如何在同一个celery容器的后台运行celery,这样就不会出现错误代码0?
\n\n2)如何在容器中并行运行芹菜和烧瓶?
\n\n-> 我已经尝试过以下操作,但出现同样的错误:
\n\ncommand: bash -c "uwsgi app.ini && celery -A tasks.celery worker --loglevel=info --detach"\nRun Code Online (Sandbox Code Playgroud)\n\n非常感谢任何帮助:)
\n\n编辑: \n我将芹菜+烧瓶放在一个容器中的原因是我的task.py。在这里,我从 web.webapp.models 导入所有 sqlalchemy 模型。所以我需要访问 Flask 目录,目前我没有看到如何将其分成两个容器的方法
\n如果您需要在两个不同进程之间“共享”的唯一内容是代码,那么它已经存在于构建的 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 创建一个默认网络,并使用名称将所有服务附加到它他们的服务块。我还删除了许多其他无关紧要的选项。)
| 归档时间: |
|
| 查看次数: |
2811 次 |
| 最近记录: |