Проблема запуска UPNP на Docker

Я пытаюсь запустить службу UPnP в моем док-контейнере с помощью библиотеки Cling UPNP ( http://4thline.org/projects/cling/). Существует простая программа, которая создает устройство (в программном обеспечении), в котором размещается какой-либо сервис. Это написано на Java, и когда я пытаюсь запустить программу, я получаю следующее исключение (Примечание: это прекрасно работает прямо на моей машине с Ubuntu):

Jun 5, 2015 1:47:24 AM org.teleal.cling.UpnpServiceImpl <init>
INFO: >>> Starting UPnP service...
Jun 5, 2015 1:47:24 AM org.teleal.cling.UpnpServiceImpl <init>
INFO: Using configuration: org.teleal.cling.DefaultUpnpServiceConfiguration
Jun 5, 2015 1:47:24 AM org.teleal.cling.transport.RouterImpl <init>
INFO: Creating Router: org.teleal.cling.transport.RouterImpl
Exception occured: org.teleal.cling.transport.spi.InitializationException: Could not discover any bindable network interfaces and/or addresses
org.teleal.cling.transport.spi.InitializationException: **Could not discover any bindable network interfaces and/or addresses
    at org.teleal.cling.transport.impl.NetworkAddressFactoryImpl.<init>(NetworkAddressFactoryImpl.java:99)**

0 ответов

Для тех, кто находит это и нуждается в ответе.

Ваш контейнер скрывает вашу внешнюю сеть. Другими словами, контейнеры по умолчанию изолированы и не могут видеть внешнюю сеть, которая, конечно, требуется для открытия портов в вашем IGD.

Вы можете запустить свой контейнер как "хост", чтобы сделать его не изолированным, просто добавьте --network host к вашей команде создания контейнера.

Пример (взят из https://docs.docker.com/network/network-tutorial-host/):

docker run --rm -d --network host --name my_nginx nginx

Я проверил это с помощью docker-compose, который выглядит немного иначе:

version: "3.4"
services:
  upnp:
  container_name: upnp
  restart: on-failure:10
  network_mode: host  # works while the container runs
  build:
    context: .
    network: host  # works during the build if needed

версия 3.4 очень важна и network: host иначе работать не будет!

мой upnp Контейнер Dockerfile выглядит так:

FROM alpine:latest

RUN apk update
RUN apk add bash
RUN apk add miniupnpc

RUN mkdir /scripts
WORKDIR /scripts
COPY update_upnp .
RUN chmod a+x ./update_upnp

# cron to update each UPnP entries every 10 minutes
RUN echo -e "*/10\t*\t*\t*\t*\tbash /scripts/update_upnp 8080 TCP" >> /etc/crontabs/root

CMD ["crond", "-f"]

# on start, open needed ports
ENTRYPOINT bash update_upnp 80 TCP && bash update_upnp 8080 TCP

update_upnp Сценарий просто использует upnpc (устанавливается как miniupnpc в Dockerfile выше), чтобы открыть порты.

Надеюсь, это кому-нибудь поможет.

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