Я пытаюсь подключить Django и rabbitmq с помощью докера, но получаю эту ошибку «socket.gaierror: [Errno -2] Имя или служба неизвестна» при запуске docker-compose up. Произошел сбой соединения между контейнером Django и контейнером rabbitmq в файле производителя.py, хотя я указал имя контейнера rabbitmq в строке подключения.
докер-compose.yml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.8-management-alpine
ports:
- 15673:15672
environment:
RABBITMQ_DEFAULT_VHOST: vhost
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
healthcheck:
test: rabbitmq-diagnostics check_port_connectivity
interval: 30s
timeout: 30s
retries: 10
restart: always
backend:
build:
context: .
dockerfile: Dockerfile
command: python manage.py runserver 0.0.0.0:8000
ports:
- 8000:8000
volumes:
- .:/app
restart: always
depends_on:
rabbitmq:
condition: service_healthy
view.py
from .producer import publish
class SampleView(APIView):
def get(self, request):
print('HERE')
publish('data send', {'message':'Here'})
return Response({'message': 'HERE'})
производитель.py
import pika
import json
import os
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='amqp://guest:guest@rabbitmq:5672/vhost')
)
channel = connection.channel()
channel.queue_declare(queue='main')
def publish(method, body):
properties = pika.BasicProperties(method)
# body = bytes(body)
channel.basic_publish(exchange='', routing_key='main', body=body, properties=properties)
channel.close()
ping: rabbitmq: временный сбой в разрешении имен
Есть ли шанс, что вы пытаетесь запустить свою программу в Dockerfile? Он работает в другой сетевой среде и не сможет подключиться к RabbitMQ или другим контейнерам.
Вы пытались создать новую сеть докеров и добавить туда оба этих контейнера? Когда даже пинг не проходит, это предполагает, что происходит что-то, связанное с сетью.
Вы неправильно настраиваете соединение, два варианта:
connection = pika.BlockingConnection(
pika.ConnectionParameters(
host='rabbitmq',
port=5672,
vhost='vhost',
credentials=pika.PlainCredentials('guest', 'guest')
)
)
Обратите внимание, что вы можете опустить и порт, и учетные данные, поскольку вы используете значения по умолчанию, заполнив их здесь, чтобы предоставить полный пример конфигурации.
connection = pika.BlockingConnection(
pika.URLParameters('amqp://guest:guest@rabbitmq:5672/vhost')
)
По ходу вы пытались указать URL-адрес в качестве хоста, поэтому он действительно не может преобразовать предоставленное значение в фактический хост.
Соответствующая документация доступна здесь
Каков результат
ping rabbitmq
в сервисеbackend
? Он разрешается в IP?