aiohttp.client_exceptions.ClientConnectorError с ботом Discord с использованием Docker-compose и Lavalink

#python #docker #docker-compose #discord #discord.py

Вопрос:

Я создаю бота Discord на python, и я получаю ошибку, когда мой бот пытается подключиться к lavalink. Я использую Docker-compose для бота и lavalink, а мой клиент lavalink-wavelink. Я проверил, что lavalink находится в нужном порту.

Кто-нибудь имеет хоть малейшее представление, в чем дело?

Мой docker-compose.yml :

 version: "3.9"

services:
  bot:
    build:
      context: .
      dockerfile: Dockerfile
    restart: on-failure
    depends_on:
      lavalink:
        condition: service_started

  lavalink:
    container_name: lavalink
    image: fredboat/lavalink:master
    volumes:
      - ./Lavalink/application.yml:/opt/Lavalink/application.yml
    ports:
      - 2333
    restart: always
 

Мой music.py :

 class Music(commands.Cog, wavelink.WavelinkMixin, name="music"):
    def __init__(self, client):
        self.client = client
        self.fancy_name = "Music"

        if not hasattr(client, 'wavelink'):
            self.client.wavelink = wavelink.Client(bot=self.client)

        self.client.loop.create_task(self.start_nodes())
    

    async def start_nodes(self):
        await self.client.wait_until_ready()

        await self.client.wavelink.initiate_node(host='127.0.0.1',
                                            port=2333,
                                            rest_uri='http://127.0.0.1:2333',
                                            password="pass",
                                            identifier='MAIN',
                                            region='us_central')
 

И моя ошибка:

  Traceback (most recent call last):
   File "/usr/local/lib/python3.9/site-packages/wavelink/websocket.py", line 76, in _connect
     self._websocket = await self._node.session.ws_connect(uri, headers=self.headers, heartbeat=self._node.heartbeat)
   File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 721, in _ws_connect
     resp = await self.request(method, url,
   File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 480, in _request
     conn = await self._connector.connect(
   File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 523, in connect
     proto = await self._create_connection(req, traces, timeout)
   File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 858, in _create_connection
     _, proto = await self._create_direct_connection(
   File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1004, in _create_direct_connection
     raise last_exc
   File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 980, in _create_direct_connection
     transp, proto = await self._wrap_create_connection(
   File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 943, in _wrap_create_connection
     raise client_error(req.connection_key, exc) from exc
 aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 127.0.0.1:2333 ssl:default [Connect call failed ('127.0.0.1', 2333)]
 

Ответ №1:

Ваш бот-контейнер должен подключаться http://lavalink:2333 , а не сам по себе. 127.0.0.1

Ответ №2:

Ваше сопоставление неверно, вы объявили порт, но не сопоставили его с вашим локальным хост-портом. измените это

  ports:
      - 2333
 

Для

 ports:
    - "2333:2333"
 

это сопоставит порт из вашего контейнера docker, в котором работает lavalink, с вашим локальным портом 2333 хоста, или вы можете назначить любой порт, который хотите.

порты:

  • «first_arg:second_arg» первый : порт локального хоста второй: порт контейнера докера

Комментарии:

1. Код выполняется в контейнере, а не на хосте. Поэтому сопоставления портов не имеют значения