diff --git a/docker-compose.yml b/docker-compose.yml index c7da87b..ac4832a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,15 +37,27 @@ services: # mscli + master_service socket so the container can stop the # Unitree video_hub_pc4 service (it holds /dev/video4 — the D435i # V4L2 node — and would otherwise make Open() fail with EBUSY). + # Mount the *directory*, not the socket file: master_service unlinks + # and recreates the socket on every host boot/restart, and a bind + # mount of the file pins the old (now dead) inode, so every mscli + # call inside the container fails with "Connect to server error". - /unitree/sbin/mscli:/unitree/sbin/mscli:ro - - /unitree/var/run/master_service.sock:/unitree/var/run/master_service.sock + - /unitree/var/run:/unitree/var/run entrypoint: - bash - -c - | - /unitree/sbin/mscli stopservice video_hub_pc4 >/dev/null 2>&1 || true + stop_videohub() { + out=$$(/unitree/sbin/mscli stopservice video_hub_pc4 2>&1) || true + case "$$out" in + *"Connect to server error"*|*"connect error"*) + echo "[entrypoint] WARN mscli cannot reach master_service.sock:" \ + "/dev/video4 will stay busy and the camera will not open. $$out" >&2 ;; + esac + } + stop_videohub sleep 2 - ( while sleep 10; do /unitree/sbin/mscli stopservice video_hub_pc4 >/dev/null 2>&1 || true; done ) & + ( while sleep 10; do stop_videohub; done ) & exec /app/entrypoint.sh env_file: .env depends_on: