Не удалось подключить Django с rabbitmq с помощью докера

Я пытаюсь подключить 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 в сервисе backend? Он разрешается в IP?

Andromeda 12.04.2023 11:12

ping: rabbitmq: временный сбой в разрешении имен

Usama Hameed 12.04.2023 11:37

Есть ли шанс, что вы пытаетесь запустить свою программу в Dockerfile? Он работает в другой сетевой среде и не сможет подключиться к RabbitMQ или другим контейнерам.

David Maze 12.04.2023 12:52

Вы пытались создать новую сеть докеров и добавить туда оба этих контейнера? Когда даже пинг не проходит, это предполагает, что происходит что-то, связанное с сетью.

JustLudo 12.04.2023 12:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы неправильно настраиваете соединение, два варианта:

  1. Параметры подключения:
connection = pika.BlockingConnection(
    pika.ConnectionParameters(
        host='rabbitmq',
        port=5672,
        vhost='vhost',
        credentials=pika.PlainCredentials('guest', 'guest')
    )
)

Обратите внимание, что вы можете опустить и порт, и учетные данные, поскольку вы используете значения по умолчанию, заполнив их здесь, чтобы предоставить полный пример конфигурации.

  1. URL-параметры:
connection = pika.BlockingConnection(
    pika.URLParameters('amqp://guest:guest@rabbitmq:5672/vhost')
)

По ходу вы пытались указать URL-адрес в качестве хоста, поэтому он действительно не может преобразовать предоставленное значение в фактический хост.

Соответствующая документация доступна здесь

Другие вопросы по теме