【问题标题】:Docker-compose: bind Celery to Postgres databaseDocker-compose:将 Celery 绑定到 Postgres 数据库
【发布时间】:2019-04-19 19:07:22
【问题描述】:

我的 Docker 应用程序以 Flask 作为后端和 Celery 作为异步任务管理器运行。然后将任务结果转储到 Postgres 拥有的 SQLalchemy 数据库中。

但是,我无法让 Celery 与 Postgres 交互。

配置:

docker-compose-dev.yml

  web:
    build:
      context: ./services/web
      dockerfile: Dockerfile-dev
    volumes:
      - './services/web:/usr/src/app' 
    ports:
      - 5001:5000
    environment:
      - FLASK_ENV=development
      - APP_SETTINGS=project.config.DevelopmentConfig
      - DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev 
      - DATABASE_TEST_URL=postgres://postgres:postgres@web-db:5432/web_test
      - SECRET_KEY=my_precious  
    depends_on:  
      - web-db
      - redis

  web-db:  
    build:
      context: ./services/web/project/db
      dockerfile: Dockerfile
    ports:
      - 5435:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  celery:
    image: dev3_web
    restart: always
    volumes:
     - ./services/web:/usr/src/app
     - ./services/web/celery_logs:/usr/src/app/celery_logs

    command: celery worker -A celery_worker.celery --loglevel=DEBUG --logfile=celery_logs/celery.log -Q cache
    environment:
     - CELERY_BROKER=redis://redis:6379/0
     - CELERY_RESULT_BACKEND=redis://redis:6379/0
    depends_on:
     - web
     - redis
    links:
     - redis:redis
     - web-db

  redis:
    image: redis:5.0.3-alpine
    restart: always
    expose:
      - '6379'
    ports:
      - '6379:6379'

  monitor:
    image: dev3_web
    ports:
      - 5555:5555
    command:  flower -A celery_worker.celery --port=5555 --broker=redis://redis:6379/0
    depends_on:
      - web
      - redis

日志:

celery_1| Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".

如何将 Celery 任务绑定到我的 Postgres 数据库?

【问题讨论】:

  • 嗨,data_garden。我想知道我们是否可以再次编辑这个?我编辑这个是因为这里的引号块的用法不是引号,并且内联代码格式的一些用法不是代码。这些格式类型与 HTML 一样具有特定的语义含义,最好不要将它们误用作一般的荧光笔。如果您使用相同的方法有很长的帖子,情况尤其如此。
  • (Dockerfilepostgres 之类的代码格式化是可以的,因为文件名和 Unix 用户经常呈现到控制台。控制台 I/O 使用代码格式化也很好. 但是 Celery、Docker、Flask 等是专有名词,因此应该使用首字母大写(或在适当的情况下使用特殊的大写规则,例如驼峰式或全大写,具体取决于每个名称的正常书写方式) ))。
  • “database”的拼写错误也被重新添加到标题中。
  • 肯定一半,做我的客人,随心所欲……
  • 谢谢你,data_garden!如果您也能遵守这些约定,志愿编辑将不胜感激 - 如果将来创建新帖子,他们可能不愿意提高您之前帖子的可读性:-)

标签: postgresql docker-compose celery flask-sqlalchemy


【解决方案1】:
celery_1   | Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".

提示您的 celery 容器中的错误,缺少有价值的环境设置,您可能需要基于 dev3_web 创建的 DATABASE_URL 设置。

更改需要应用于您的 docker-compose-dev.yml:

  celery:
    image: dev3_web
    restart: always
    volumes:
     - ./services/web:/usr/src/app
     - ./services/web/celery_logs:/usr/src/app/celery_logs

    command: celery worker -A celery_worker.celery --loglevel=DEBUG --logfile=celery_logs/celery.log -Q cache
    environment:
     - CELERY_BROKER=redis://redis:6379/0
     - CELERY_RESULT_BACKEND=redis://redis:6379/0
     - APP_SETTINGS=project.config.DevelopmentConfig
     - DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev 
    depends_on:
     - web
     - redis
    links:
     - redis:redis
     - web-db

【讨论】:

  • 在您的- CELERY_RESULT_BACKEND=redis://redis:6379/0 下方添加- DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev ?
  • 只有当我在下面添加DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev APP_SETTINGS=project.config.DevelopmentConfig 时它才有效。为了完整起见,您能否将两者都添加到您的答案中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2019-04-13
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多