상황은 이렇습니다.
- 호스트 시스템에서 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
.
컨테이너가 호스트 네트워크를 관리하도록 허용하는 것은 실제로 안전하지 않습니다. 서비스를 인터넷에 노출하는 등 중요한 작업에 이 컨테이너를 사용하면 안 됩니다. 자신의 목적을 위해 로컬에 머무르는 한 괜찮을 것 같습니다.