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