Docker-контейнер django не может получить доступ к контейнеру redis при использовании redis в качестве бэкенда сеанса
Я пытаюсь развернуть промежуточную среду, которая имитирует мой django+postgresql(AWS RDS)+redis(AWS Elasticache).
Я использую последнюю версию django-redis(4.10) для настройки django с помощью redis. Мои настройки следующие:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
# Mimicing memcache behavior.
# http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior
"IGNORE_EXCEPTIONS": True,
},
}
}
# django-redis: use redis as session cache
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
Когда я запускаю это локально в моей среде pipenv, при этом postgresql работает удаленно на сервере AWS RDS & redis, работающем локально на brew services
все работает нормально. Но если я docker-compose up
контейнеры, обработка сессии django, кажется, нарушается.
Мой docker-compose выглядит следующим образом: (Обратите внимание, что, поскольку я собираюсь использовать AWS RDS и Elasticache, я не включил контейнеры postgres и redis в файл compose)
version: '3.7'
services:
django: &django
restart: always
build:
context: .
dockerfile: ./compose/staging/django/Dockerfile # expose 8000
image: staging_django
container_name: staging_django
hostname: staging_django
networks:
- backend
env_file:
- ./.envs/.staging/.django
command: /start
nginx:
build:
context: .
dockerfile: ./compose/staging/nginx/Dockerfile
image: staging_nginx
container_name: staging_nginx
hostname: nginx
ports:
- "80:80"
networks:
- backend
restart: on-failure
links:
- django
depends_on:
- django
networks:
backend:
driver: 'bridge'
Когда я пытаюсь войти на сайт администратора, контейнер django возвращает следующие ошибки.
staging_django | File "/usr/local/lib/python3.7/site-packages/django/contrib/sessions/backends/cache.py", line 51, in create
staging_django | "Unable to create a new session key. "
staging_django | RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
Я могу подтвердить, что django не имеет доступа к серверу redis, потому что MONITOR в redis-cli не показывает журналы, связанные с django.
Если я закомментирую две строки в вышеупомянутых settings.py,
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
Я могу войти в администратор без проблем, так что это определенно связано с использованием redis в качестве бэкэнда сессии, и, возможно, из-за того, что redis недоступен из контейнера док-станции django.
Любая помощь очень ценится! Я работал два полных дня, чтобы решить эту проблему, и теперь мой начальник запугивает меня за это.:(
1 ответ
Я бы положил в Redis docker-compose.yml
также.
А затем в вашем файле настроек django используйте имя сервиса для redis, вот так:
докер-compose.yml
version: '3'
services:
web_app_server:
container_name: web_app_server
depends_on:
- session_caching
session_caching:
container_name: session_caching
image: redis:latest
restart: always
settings.py
"LOCATION": "redis://session_caching:6379/1",