связь между контейнерами в docker-compose

у меня возникла проблема в подключении к mqtt серверу из моего сервиса. Сервисы связаны так:

name: ikm
services:
  mqtt:
    image: eclipse-mosquitto:latest
    container_name: mqtt
    ports:
      - "1883:1883"  
    expose:
      - "1883"
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log
    networks:
      - IKM
    hostname: mqtt

  calculate_module:
    build:
      context: ./calculate_module 
      dockerfile: Dockerfile
    container_name: calculate_module
    depends_on:
      - mqtt
    ports:
      - "8000:8000"  
    expose:
      - "8000"
    networks:
      - IKM
    hostname: calculate_module

networks:
  IKM:
    driver: bridge


так пытаюсь подключиться к мктт

    async fn connect_mqtt() -> Result<(AsyncClient, EventLoop)> {
        let mut mqttoptions = MqttOptions::new("ikm22848", "mqtt", 1883);
        mqttoptions.set_max_packet_size(256 * 1024 * 1024, 256 * 1024 * 1024);
        mqttoptions.set_keep_alive(Duration::from_secs(30));
        mqttoptions.set_inflight(10);

        let (mqtt_client, event_loop) = AsyncClient::new(mqttoptions, 10);
        Ok((mqtt_client, event_loop))
    }

в любом случае получаю ошибку (с внешними адрессами все нормально работает):

{
  "result": "Ошибка отправки сообщения: Request(Publish(Topic = IKM, Qos = AtLeastOnce, Retain = false, Pkid = 0, Payload Size = 4))"
}

испольльзую

rumqttc = "0.24.0"

пробовал добавлять hostname в докер композ, убирать сеть, убирать порты.. ничего не помогло


Ответы (1 шт):

Автор решения: Exdet

дело не в докере было, а как rumqttc обрабатывает соединение (нужно ручками поллить).

    pub async fn init() -> Result<Self> {
        let (mqtt_client, mut event_loop) = Self::connect_mqtt().await?;

+        tokio::spawn(async move {
+            while let Ok(notification) = event_loop.poll().await {
+                println!("Received = {:?}", notification);
+            }
+        });

        let result = mqtt_client
            .publish(...)
    ....

без полинга отправлять сколько угодно можно - отправляться не будет

→ Ссылка