Периодическая ошибка "не удалось перевести хост" при установке Postgres, Django и Docker Swarm

У меня есть стек с двумя узлами, только один менеджер в Docker Swarm, одна реплика db на менеджере и 3 реплики web (Django backend). Время от времени я получаю эту ошибку в логах моего веб-контейнера

psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known
/usr/local/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py:105: RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': could not translate host name "db" to address: Name or service not known

Когда я собирал это локально, я получал эту ошибку, например, после перезагрузки машины, но затем я просто docker-compose down и up снова, и она исчезала. (Я так и не нашел другого решения для этого). Однако теперь в моем стеке swarm у меня нет обходного пути.

Я не знаю, что именно вызывает это, я перепробовал все, что смог найти, изменив SQL_HOST на localhost, поместив имя стека перед сервисом: stack_db, добавление POSTGRES_HOST_AUTH_METHOD=trust в окружение db, добавление web и db в одну сеть, изменение образа postgres на postgres:13.4-alpine, добавление правила depends_on, для которого я использую скрипт с моей командой deploy (я также анализирую его с помощью docker-compose для учета env файлов):

docker stack deploy -c <(docker-compose -f my-compose-stack.yml config | yq e '(.services[] | select(.depends_on | tag == "!!map")).depends_on |= (. | keys)' -) stack

Кажется, ничего не работает. Я даже пытался docker compose вверх и вниз на моем стек-файле, а затем развернуть его. Странно то, что иногда, внезапно, он работает. Я не знаю, что его ломает, и что его исправляет. Пожалуйста, помогите мне разобраться с этим.

Это мой докер-стек:

version: "3.3"

services:
  db:
    image: postgres:13.4-alpine
    ports:
      - "5432:5432"
    command: "-c logging_collector=on"
    volumes:
      - ./database/postgres_data:/var/lib/postgresql/data/
    networks:
      - data_network
    environment:
      - POSTGRES_USER=student
      - POSTGRES_PASSWORD=x
      - POSTGRES_DB=x
      - POSTGRES_HOST_AUTH_METHOD=trust
    deploy:
      placement:
        constraints:
          - node.role==manager
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
  web:
    image: xxx
    depends_on:
      db:
        condition: service_started
    command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    ports:
      - 8000:8000
    env_file:
      - .env.dev
    volumes:
      - migrations-volume:/elpaso/api/migrations/
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
    networks:
      - web_network
      - data_network
networks:
  web_network:
    driver: overlay
  data_network:
    driver: overlay
volumes:
  migrations-volume:

В моем .env у меня есть

SQL_HOST=db 
SQL_PORT=5432 
SQL_USER=student
SQL_PASSWORD=x 
SQL_DATABASE=x 
SQL_ENGINE=django.db.backends.postgresql

В моей службе базы данных нет журналов, и все остальное, похоже, работает. Час назад веб-служба работала, а после удаления стека и повторного развертывания это произошло. Я упомянул, что у меня также есть контейнер nginx на моем менеджере и 3 реплики React, но я исключил их, поскольку не думаю, что они связаны. Пожалуйста, дайте мне знать, если я могу предоставить еще какую-либо информацию. Спасибо!

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