【问题标题】:How to fix no module error in flask RQ worker如何修复烧瓶 RQ 工作者中的无模块错误
【发布时间】:2019-05-16 07:47:18
【问题描述】:

我正在使用 docker-compose 构建一个带有 Redis 和一个 worker 的 Web 应用程序。此外,我还有要监控的 rq-dashboard。

整个项目在vagrant-ubuntu环境中

项目结构:

project/
       app_main/
                moduleA/
                        classA  - The task to do
                jobs.py    - Implements the job
                queue.py   - Has the code perform.queue(id)
      scripts/
              worker/
                     dockerfile
                     worker.py
      dockerfile
      docker-compose.yml
      app.py

docker 构建正确,应用程序运行良好。但是当worker运行时会报错:ModuleNotFoundError: No module named 'app_main'

我在 docker-compose 中添加了 --path 而不是单独的 dockerfile,但仍然出现错误。


# jobs.py
from flask_rq2 import RQ
from app_main.moduleA.classA import methodA

rq = RQ(redis_url="redis://redis:6379/0")

@rq.job
def perform(id):

    methodA().subMethodA(id)

    return True


# worker.py

import os

import redis
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']

redis_url = os.getenv('REDISTOGO_URL', 'redis://redis:6379')

conn = redis.from_url(redis_url)

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

码头工人撰写


version: "3.7"

services:

  web:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    ports:
      - "5000:5000"
    depends_on:
      - redis
    restart: always
    volumes:
      - .:/app
    image: web
    environment:
      - MODE=dev
      - REDIS_URL='redis://redis:6379/0'
      - RQ_REDIS_URL='redis://redis:6379/0'
    networks:
      - app-net

  redis:
    image: redis:4.0.11-alpine
    command: ["redis-server", "--appendonly", "yes"]
    hostname: redis
    networks:
      - app-net
    volumes:
      - redis-data:/data


  dashboard:
    build: ./app_main/dashboard
    image: dashboard
    container_name: dashboard
    ports:
      - '9181:9181'
      - '6379:6379'
    command: rq-dashboard -H redis
    networks:
      - app-net
    volumes:
      - redis-data:/data

  job_worker:
    build: ./scripts/worker
    depends_on:
      - redis
    networks:
      - app-net
    volumes:
      - redis-data:/data

# Docker network
networks:
  app-net:

volumes:
  redis-data:

错误日志

[31mjob_worker_1    |[0m Traceback (most recent call last):
[31mjob_worker_1    |[0m   File "/usr/local/lib/python3.7/site-packages/rq/worker.py", line 812, in perform_job
[31mjob_worker_1    |[0m     rv = job.perform()
[31mjob_worker_1    |[0m   File "/usr/local/lib/python3.7/site-packages/rq/job.py", line 588, in perform
[31mjob_worker_1    |[0m     self._result = self._execute()
[31mjob_worker_1    |[0m   File "/usr/local/lib/python3.7/site-packages/rq/job.py", line 594, in _execute
[31mjob_worker_1    |[0m     return self.func(*self.args, **self.kwargs)
[31mjob_worker_1    |[0m   File "/usr/local/lib/python3.7/site-packages/rq/job.py", line 199, in func
[31mjob_worker_1    |[0m     return import_attribute(self.func_name)
[31mjob_worker_1    |[0m   File "/usr/local/lib/python3.7/site-packages/rq/utils.py", line 155, in import_attribute
[31mjob_worker_1    |[0m     module = importlib.import_module(module_name)
[31mjob_worker_1    |[0m   File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
[31mjob_worker_1    |[0m     return _bootstrap._gcd_import(name[level:], package, level)
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 983, in _find_and_load
[31mjob_worker_1    |[0m   File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
[31mjob_worker_1    |[0m ModuleNotFoundError: No module named 'app_main'

工人码头文件

FROM python:3

ADD ./worker.py .

RUN pip install rq redis

ENTRYPOINT ["python"]

CMD ["./worker.py"]

【问题讨论】:

  • 主脚本是什么,您运行哪个脚本来启动应用程序?是app.py吗?
  • 是的,它的 app.py。它位于 Web 容器中。
  • 你能发布你的 docker-compose.yml 吗?
  • 你的 python 路径呢? (与sys.path
  • @Mihai 我用 docker-composer 编辑了它

标签: python-3.x flask redis docker-compose


【解决方案1】:

我尝试了很多解决方案,都没有奏效。

我所做的解决方案是,我将工人 dockerfile 放到了根文件夹中。使用 WORKDIR ./app 修改 dockerfile 并从 pip install -r requirements.txt 安装依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多