dbusサービスを別のバスに接続する

dbusサービスを別のバスに接続する

状況はこんな感じです。

  • ホストシステムでNetworkManagerを実行しています。
  • 特権Dockerコンテナでsystemdとdbusを実行しています。
  • コンテナのnmcliがホストシステムのNetworkManagerにアクセスできるようにしたいです。
  • ただし、コンテナ内のdbusサービスにもアクセスできる必要があります。
  • コンテナのNetworkManagerにアクセスするクライアントは、コンテナ内の他のDbusサービス(ログインなど)にもアクセスするため、バス全体をコンテナに渡すだけでは不十分です。

目的は、NetworkManager に対する要求を親 dbus にルーティングし、他の要求はコンテナ dbus にルーティングすることです。

私はこれを達成するためにxdg-dbus-proxyの使用を見ました。しかし、それを使用することはできません

答え1

ホストのDBUSソケットをコンテナに直接マウントするのはどうですか?

sudo docker run -v /run/user/1000/bus:/host-dbus.sock --rm -it your_container

これにより、コンテナ内のすべてのDBUSトラフィックは変更されずに維持され、使用するには次のプレフィックスを追加して環境変数をオーバーライドnmcliできます。DBUS_SYSTEM_BUS_ADDRESS

DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host-dbus.sock nmcli [something]

/usr/local/bin毎回プレフィックスを付ける代わりに、次のようにラッパーを作成することもできます。

#!/bin/sh
export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host-dbus.sock
exec /usr/bin/nmcli "$@"

PATHが正しく設定されている場合は、になければなりません/usr/local/bin/usr/binコマンドラインから呼び出されるたびに、nmcli実際のプログラムの代わりにこのラッパーを使用し、DBUS環境変数を設定し、すべての引数を元のプログラムに渡します。忘れないでくださいchmod +x /usr/local/bin/nmcli

コンテナがホストネットワークを管理できるようにすることは、実際には安全ではありません。サービスをインターネットに公開するなど、重要な作業にこのコンテナを使用しないでください。自分の目的のためにローカルに滞在する限り、大丈夫そうです。

関連情報