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",
Другие вопросы по тегам