Периодическая ошибка "не удалось перевести хост" при установке 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, но я исключил их, поскольку не думаю, что они связаны. Пожалуйста, дайте мне знать, если я могу предоставить еще какую-либо информацию. Спасибо!