Не удается заполнить индекс elasticsearch с помощью ``python manage.py search_index --rebuild`` в django с помощью docker

Я использую django, elasticsearch и postgresql из docker в отдельных контейнерах. Когда я пытаюсь запустить python manage.py search_index --rebuild, я получаю следующую ошибку:


    Traceback (most recent call last):
      File "C:\Users\ashut\Desktop\ramrobazar\manage.py", line 22, in <module>
        main()
      File "C:\Users\ashut\Desktop\ramrobazar\manage.py", line 18, in main
        execute_from_command_line(sys.argv)
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
        utility.execute()
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django\core\management\__init__.py", line 440, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django\core\management\base.py", line 414, in run_from_argv
        self.execute(*args, **cmd_options)
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django\core\management\base.py", line 460, in execute
        output = self.handle(*args, **options)
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django_elasticsearch_dsl\management\commands\search_index.py", line 166, in handle
        self._rebuild(models, options)
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django_elasticsearch_dsl\management\commands\search_index.py", line 143, in _rebuild
        if not self._delete(models, options):
      File "C:\Users\ashut\Desktop\ramrobazar\venv\lib\site-packages\django_elasticsearch_dsl\management\commands\search_index.py", line 132, in _delete
        "the '{}' indexes? [y/N]: ".format(", ".join(index_names)))
    TypeError: sequence item 0: expected str instance, NoneType found

Все остальное работает нормально. Когда я запускаю docker-compose up, все мои контейнеры, т.е. база данных postgresql, веб-сервис и контейнеры elasticsearch, начинают работать без каких-либо проблем. Веб-сайт начинает работать на localhost:8000, и я также могу создавать новых пользователей из панели администратора. Итак, веб-сайт и база данных работают нормально. На localhost:9200 я могу видеть следующий JSON:


    {
      "name" : "4336b15c63fa",
      "cluster_name" : "docker-cluster",
      "cluster_uuid" : "a_long_string",
      "version" : {
        "number" : "7.14.2",
        "build_flavor" : "default",
        "build_type" : "docker",
        "build_hash" : "a_long_string",
        "build_date" : "2021-09-15T10:18:09.722761972Z",
        "build_snapshot" : false,
        "lucene_version" : "8.9.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }

Мой docker-compose.yml:


    version: '3.8'
    
    services:
      db:
        container_name: db_ramrobazar
        image: postgres
        restart: always
        # environment:
        #   - POSTGRES_DB=postgres
        #   - POSTGRES_USER=postgres
        #   - POSTGRES_PASSWORD=postgres
        ports:
          - '5432:5432'
        volumes:
          - postgres_data:/var/lib/postgresql/data/
        env_file: .env
        networks:
          - djangonetwork
      
    
      web:
        container_name: web_ramrobazar
        build:
          context: .
        depends_on:
          - db
        command: >
          sh -c "python manage.py makemigrations && 
                 python manage.py migrate &&
                 python manage.py runserver 0.0.0.0:8000"
        ports:
          - "8000:8000"
        env_file: .env
        links:
          - db:db
        networks:
          - djangonetwork
        volumes: 
          - .:/usr/src/app
      
      
      esearch:
        container_name: search
        image: elasticsearch:7.14.2
        environment:
          - discovery.type=single-node
        ports:
          - '9200:9200'
    
    
    
    volumes:
      postgres_data:
    
    
    networks:
      djangonetwork:
        driver: bridge

Мой Dockerfile:


    FROM python:3.8-slim-buster
    
    
    # setting work directory
    WORKDIR /usr/src/app
    
    
    # env variables
    ENV PYTHONUNBUFFERED 1
    ENV PYTHONDONTWEITEBYTECODE 1
    
    # install psycopg dependencies
    RUN apt-get update && apt-get install -y \
        build-essential \
        libpq-dev \
        && rm -rf /var/lib/apt/lists/*
    
    
    # install dependencies
    RUN pip install --upgrade pip
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    
    
    COPY . .

Мой documents.py:


    from django_elasticsearch_dsl import Document
    from django_elasticsearch_dsl.registries import registry
    from .models import User
    
    
    @registry.register_document
    class UserDocument(Document):
    
        class index:
            name = 'user'
        
        class Django:
            model = User
            fields = ['id', 'first_name',]

Мой settings.py:


    INSTALLED_APPS = [
        'phonenumber_field',
        'ramrobazar.account.apps.AccountConfig',
        'ramrobazar.dashboard.apps.DashboardConfig',
        'ramrobazar.inventory.apps.InventoryConfig',
        'mptt',
        'django_elasticsearch_dsl',
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    .
    .
    .
    ELASTICSEARCH_DSL = {
        'default' : {'hosts': '127.0.0.1:9200'}
    }

Это мой первый опыт использования docker и elasticsearch. Пожалуйста, дайте мне знать, если потребуется что-то еще.

< <

Итак, я не уверен, как это работает, но я думаю, что нашел решение. Я просто пробовал разные случайные вещи. Поскольку ошибка, которую я получал, была ConnectionError, я попробовал удалить все строки, связанные с "сетью" из моего docker-compose.yml и это как-то сработало.

Мой новый docker-compose.yml:


    version: '3.8'
    
    services:
      db:
        container_name: db_ramrobazar
        image: postgres
        restart: always
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        ports:
          - '5432:5432'
        volumes:
          - postgres_data:/var/lib/postgresql/data/
        # env_file: .env
        # networks:
        #   - djangonetwork
      
    
      web:
        container_name: web_ramrobazar
        build:
          context: .
        depends_on:
          - db
        command: >
          sh -c "python manage.py makemigrations &&
                 python manage.py migrate &&
                 python manage.py runserver 0.0.0.0:8000"
        ports:
          - "8000:8000"
        env_file: .env
        # links:
        #   - db:db
        # networks:
        #   - djangonetwork
        volumes: 
          - .:/usr/src/app
      
      
      esearch:
        container_name: search
        image: elasticsearch:7.14.2
        environment:
          - discovery.type=single-node
        ports:
          - '9200:9200'
    
    
    
    volumes:
      postgres_data:
    
    
    # networks:
    #   djangonetwork:
    #     driver: bridge

Теперь команда docker-compose run --rm web python manage.py search_index --rebuild работает без проблем.

Вернуться на верх