Как «просматривать avahi» из док-контейнера?

Я запускаю контейнер на основе Ubuntu: 14.04, и мне нужно иметь возможность использовать avahi-browse внутри него. Однако:

(.env)root@8faa2c44e53e:/opt/cluster-manager# avahi-browse -a
Failed to create client object: Daemon not running
(.env)root@8faa2c44e53e:/opt/cluster-manager# service avahi-daemon status
Avahi mDNS/DNS-SD Daemon is running

Фактическая проблема, с которой я столкнулся, - это ошибка pybonjour; pybonjour.BonjourError: (-65537, 'unknown') но я читал, что это связано с проблемой avahi-daemon.

Так; как подключиться к демону avahi из контейнера?

P.S. Я должен отключить dbus в заливке avahi-daemon.conf, чтобы можно было запустить его, иначе avahi-daemon не запустится с ошибкой dbus, подобной этой: (.env)root@8faa2c44e53e:/opt/cluster-manager# avahi-daemon Found user 'avahi' (UID 103) and group 'avahi' (GID 107). Successfully dropped root privileges. avahi-daemon 0.6.31 starting up. dbus_bus_get_private(): Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory WARNING: Failed to contact D-Bus daemon. avahi-daemon 0.6.31 exiting.


person bart van deenen    schedule 04.06.2015    source источник


Ответы (5)


Насколько я могу проверить, вы можете использовать avahi-daemon хоста через сокет Unix для разрешения mDNS и /var/run/dbus для работы avali-browse.

E.g.:

docker run -v /var/run/dbus:/var/run/dbus -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket -ti debian:10-slim bash

Для проверки внутри контейнера:

apt-get update && apt-get install avahi-utils iputils-ping -y

ping whatever.local

avahi-browse -a
person leumasino    schedule 21.06.2020

Я столкнулся с той же проблемой при корректной работе avahi и dbus в Ubuntu 14.04 (в частности, я пытался использовать ROS TurtleBot). Я решил эту проблему, включив модифицированную версию инструкций из docker-systemd в свой Dockerfile:

FROM ubuntu:14.04
RUN apt-get update &&\
    apt-get install -y avahi-utils avahi-daemon libnss-mdns systemd
RUN cd /lib/systemd/system/sysinit.target.wants/;\
  ls | grep -v systemd-tmpfiles-setup | xargs rm -f $1 \
    rm -f /lib/systemd/system/multi-user.target.wants/*;\
  rm -f /etc/systemd/system/*.wants/*;\
  rm -f /lib/systemd/system/local-fs.target.wants/*; \
  rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
  rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
  rm -f /lib/systemd/system/basic.target.wants/*;\
  rm -f /lib/systemd/system/anaconda.target.wants/*; \
  rm -f /lib/systemd/system/plymouth*; \
  rm -f /lib/systemd/system/systemd-update-utmp*
RUN mkdir -p /var/run/dbus
ENV init /lib/systemd/systemd

После изменения вашего Dockerfile для включения этих инструкций вы должны создать контейнер с помощью следующей команды:

docker run --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -it <DOCKER_IMAGE> /bin/bash

Наконец, как только вы окажетесь внутри контейнера, вы должны выполнить следующие команды, прежде чем пытаться использовать avahi-browse (напрямую или косвенно):

$ dbus-service --system
$ /etc/init.d/avahi-daemon start
person ChrisTimps    schedule 16.12.2016

Avahi требует D-BUS для связи с клиентами. Похоже, ваш док-контейнер не запускает системный D-BUS. Если вы это сделаете, то Avahi должен работать.

Вам нужен D-BUS для большинства функций Avahi (включая avahi-browse), поэтому его отключение не поможет.

person Trent Lloyd    schedule 03.07.2015

Существует образ докера, предположительно поддерживающий avahi изнутри контейнера. Хитрость заключается в том, чтобы смонтировать /var/run/dbus с хоста в контейнер.

Обратите внимание, что мне не удалось запустить этот образ на моей версии 16.04. хозяин.

person Frederick Nord    schedule 15.06.2016

Другим решением является использование mdns-repeater на хосте для пересылки пакетов mDNS в сеть Docker.

mdns-repeater eth1 docker0

person Alon Amsalem    schedule 17.08.2020