python-3.x - 如何修复 flask RQ worker 中的无模块错误

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

我正在使用 docker-compose 构建一个带有 Redis 和 worker 的网络应用程序。此外,我有 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()

docker-compose


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'

worker 码头文件

FROM python:3

ADD ./worker.py .

RUN pip install rq redis

ENTRYPOINT ["python"]

CMD ["./worker.py"]

最佳答案

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

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

关于python-3.x - 如何修复 flask RQ worker 中的无模块错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56163420/

相关文章:

python - 使用带循环的漂亮汤在 Python 中制作 Webscrape 交互式图表

redis - 如何将 `keys_and_args` 传递给 redis-py' `eval` 函数,并传递给 lua 脚本

使用 call_user_func_array 插入时 redis 丢失 key

Flask CORS 问题 - 选项请求未通过

Redis 是否可以使用 mset 更新多个 hset 键(不是字段)

python - 在Python中捕获特定的错误消息

python - 如何在每次 while 循环通过时创建一个新数组

python - AttributeError : module 'dis' has no attribute '_unpack_opargs' While Building Python 3. 6 可执行使用 CX_FREEZE

python - 使用 Nginx+uWSGI 在 Flask 中提供动态媒体

python - 从 Flask 路由中的 wtforms FormField 获取数据