1

我尝试在 Docker 容器中设置 Mandos,但因 dbus 错误而失败。可以在没有 dbus 的情况下运行服务器,但是 mandos-ctl 和 mandos-monitor 需要 dbus 才能运行。

我的 Dockerfile

FROM ubuntu:16.04
RUN locale-gen de_DE.UTF-8
ENV TERM=xterm
RUN apt-get update \
    && apt-get install -y mandos \
        fping \
        dbus \
    && rm -rf /var/lib/apt/lists/*

构建它:docker build -t mandos-server .

如果我托管挂载/var/run/dbus并使用以下命令启动容器: docker run -v /dev/log:/dev/log -v /var/run/dbus:/var/run/dbus -it mandos-server bash并启动,mandos --debug我会收到以下错误:

2016-06-16 15:26:30,278 root [11]: DEBUG: Did setuid/setgid to 108:111
2016-06-16 15:26:30,280 root [11]: ERROR: Disabling D-Bus:
Traceback (most recent call last):
  File "/usr/sbin/mandos", line 3009, in main
    do_not_queue=True)
  File "/usr/lib/python2.7/dist-packages/dbus/service.py", line 131, in __new__
    retval = bus.request_name(name, name_flags)
  File "/usr/lib/python2.7/dist-packages/dbus/bus.py", line 303, in request_name
    'su', (name, flags))
  File "/usr/lib/python2.7/dist-packages/dbus/connection.py", line 651, in call_blocking
    message, timeout)
DBusException: org.freedesktop.DBus.Error.AccessDenied: Connection ":1.362" is not allowed to own the service "se.recompile.Mandos" due to security policies in the configuration file

二试:不挂载dbus启动容器docker run -v /dev/log:/dev/log -it mandos-server bash ,手动启动dbus: /etc/init.d/dbus start * Starting system message bus dbus [ OK ]

mandos --debug导致以下错误:

2016-06-16 15:36:38,338 root [40]: DEBUG: Did setuid/setgid to 108:111
2016-06-16 15:36:38,353 root [40]: WARNING: Could not load persistent state: No such file or directory
2016-06-16 15:36:38,359 root [40]: WARNING: No clients defined
2016-06-16 15:36:38,361 root [40]: INFO: Now listening on address '::', port 39145, flowinfo 0, scope_id 0
2016-06-16 15:36:38,363 dbus.proxies [40]: ERROR: Introspect error on org.freedesktop.Avahi:/: dbus.exceptions.DBusException: org.freedesktop.DBus.Error.Spawn.FileInvalid: Cannot do system-bus activation with no user

2016-06-16 15:36:38,363 dbus.proxies [40]: DEBUG: Executing introspect queue due to error
2016-06-16 15:36:38,363 root [40]: CRITICAL: D-Bus Exception
Traceback (most recent call last):
  File "/usr/sbin/mandos", line 3415, in main
    service.activate()
  File "/usr/sbin/mandos", line 470, in activate
    self.server_state_changed(self.server.GetState())
  File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 70, in __call__
    return self._proxy_method(*args, **keywords)
  File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 145, in __call__
    **keywords)
  File "/usr/lib/python2.7/dist-packages/dbus/connection.py", line 651, in call_blocking
    message, timeout)
DBusException: org.freedesktop.DBus.Error.Spawn.FileInvalid: Cannot do system-bus activation with no user

任何想法出了什么问题,也许是一个解决方案?

4

3 回答 3

2

该错误消息(在那条线上)并不是指 Mandos 使用 D-Bus 以便能够被控制,mandos-ctl并且mandos-monitor——它指的是 Mandos 使用 D-Bus 与 Avahi 通信以要求 Avahi 宣布Mandos 的 Zeroconf 服务。--no-zeroconf您可以通过使用该选项避免宣布 Zercoconf 服务(但请注意 Mandos 客户端默认使用 Zeroconf 来查找服务器) ,或者您可以确保 Mandos 能够从 Docker 容器内部与 Avahi 通信。

于 2016-06-17T21:27:34.393 回答
1

我不知道出了什么问题...但是我对这篇文章的回答已被删除...这是完整的解决方案:

Dockerfile:

FROM ubuntu:14.04

RUN apt-get update \
    && apt-get install -y supervisor \
        mandos \
        fping \
        rsyslog \
        dbus \
        avahi-daemon \
        avahi-utils \
        libnss-mdns \
    && mkdir -p /var/log/supervisor \
    && mkdir -p /var/run/rsyslog \
    && mkdir -p /var/run/dbus \
    && sed -i.bak s/xconsole/console/g /etc/rsyslog.conf \
    && rm -rf /var/lib/apt/lists/*

COPY ./config/mandos.conf /etc/mandos/mandos.conf
COPY ./config/clients.conf /etc/mandos/clients.conf
COPY ./config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 55555
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

主管配置文件:

[supervisord]
nodaemon=true
#loglevel=debug

[program:rsyslog]
command=/usr/sbin/rsyslogd -n
autostart=true
autorestart=true
redirect_stderr=true

[program:dbus]
command=/bin/sh -c "rm /var/run/dbus/pid || true && dbus-daemon --system --nofork"
priority=1
redirect_stderr=true

[program:avahi-daemon]
command=/usr/sbin/avahi-daemon --no-chroot

[program:mandos]
command=mandos --foreground

mandos.confclients.conf文件来自默认的 mandos 安装。

希望这对其他人有用。

于 2016-11-24T21:02:36.697 回答
1

Docker Plex提供以下说明来解决类似问题:

安全方法

注意:由于 Plex 内部的一些问题,它似乎不知道它在 Docker 子网中的本地 IP 地址,从而避免了本地发现工作。如果您真的想使用此功能,请在下面查找不安全的方法。

Avahi 守护程序通常用于帮助您的计算机查找服务器提供的服务。

Avahi 没有内置到这个 Docker 镜像中,因为由于 Docker 的网络限制,Avahi 不能传播它的消息来宣布服务脱离 Docker 虚拟网络。

如果要启用此功能,可以按照以下步骤在主机中安装 Avahi 守护程序(Ubuntu 版本):

  • 安装 avahi-daemon:运行 sudo apt-get install avahi-daemon avahi-utils
  • 将文件从 avahi/nsswitch.conf 复制到 /etc/nsswitch.conf
  • 将服务描述文件从 avahi/plex.service 复制到 /etc/avahi/services/plex.service
  • 重启 Avahi 的守护进程:sudo /etc/init.d/avahi-daemon restart

但是为什么你需要在你的主机上而不是在容器中安装它呢?因为如果您不这样做,发现消息将无法到达您的计算机。

通过这种方法我会得到什么?:该服务将在网络上公布,但您必须使用您的帐户登录才能检测您的服务器。此外,您收到的所有流媒体都会减少,就像您在外部网络中一样。

虽然这可能是正确的想法,但我无法在 Mandos 中找到足够的相似之处来成功完成该过程。特别是,我mandos.service在任何安装目录中都没有找到(或类似的)。我还将提请注意The service will be announced on the network, but you will have to login with your account to detect your server. 我不清楚这是否会对 Mandos 致命的声明。

于 2016-10-27T19:15:09.413 回答