我正在尝试将Redis用作我的使用Docker Compose的Django项目的Celery的代理。我无法弄清楚我到底做错了什么,但是尽管控制台日志消息告诉我Redis正在运行并接受连接(实际上,当我这样做时docker ps,我可以看到容器正在运行),但我仍然会收到有关拒绝连接的错误消息。我什至做到了
docker ps
docker exec -it <redis_container_name> redis-cli ping
看到回应是PONG。
PONG
这是my中的Celery设置settings.py:
settings.py
BROKER_URL = 'redis://localhost:6379/0' BROKER_TRANSPORT = 'redis' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_ENABLE_UTC = True CELERY_TIMEZONE = "UTC"
这是my中的Redis容器设置docker-compose.yml:
docker-compose.yml
redis: image: redis ports: - "6379:6379"
我还记得将redis容器与我的web容器链接起来。我可以正常启动服务器,但是在尝试将任何内容上传到站点时出现连接拒绝错误。到底出了什么问题?
redis
web
编辑 :我记得用VBoxManage端口转发,这样我可以去我的浏览器和访问我的网站的localhost:8000,所以它似乎并不像我需要使用虚拟机的IP,而不是localhost我的settings.py。
localhost:8000
localhost
编辑2 :如果localhost用docker- machine虚拟机的IP地址或Redis容器的IP地址替换设置,那么发生的事情是,当我上传文件时,我真的很快在网站上收到错误的成功消息,但是实际上没有任何内容上传。基础上载功能insertIntoDatabase()使用delay。
docker- machine
insertIntoDatabase()
delay
Django是否在与Redis容器链接的单独容器中运行?如果是这样,您应该具有一些环境变量,以及Django用于连接到Redis容器的Ip和端口。将BROKER_URL设置为使用redis Ip和port env vars,您就应该做生意。同上RESULT_BACKEND。
用于环境变量的参考文档在这里:Docker Compose文档
以下是一些示例代码,说明了我们如何在OfferUp的一个项目中使用自动添加的env var:
BROKER_TRANSPORT = "redis" _REDIS_LOCATION = 'redis://{}:{}'.format(os.environ.get("REDIS_PORT_6379_TCP_ADDR"), os.environ.get("REDIS_PORT_6379_TCP_PORT")) BROKER_URL = _REDIS_LOCATION + "/0" CELERY_RESULT_BACKEND = _REDIS_LOCATION + "/1"