主机与Docker容器并行执行adb devices的设备可见性异常问题
这个问题我之前也碰到过,核心原因就是ADB的单服务器限制——同一台机器上只能跑一个ADB服务器实例。当你在主机启动ADB服务器时,容器里的ADB客户端因为套接字访问或者权限问题连不上主机的服务器,自然看不到设备;而主机杀掉服务器后,容器里的ADB会自己启动服务器,这时候它能拿到设备权限,所以又能识别了。
下面是我亲测有效的解决步骤:
- 共享ADB套接字与密钥目录
ADB通过/tmp/adb.sock这个套接字文件实现客户端和服务器的通信,同时~/.android目录里存着设备授权的密钥。我们只需要把这两个路径挂载到容器里,让容器直接复用主机的ADB环境就行。启动容器的时候加上这两个挂载参数:
docker run -v /tmp/adb.sock:/tmp/adb.sock -v ~/.android:/root/.android [你的容器镜像名称]
解释一下:
/tmp/adb.sock挂载后,容器内的ADB客户端直接连接主机的ADB服务器,不用自己启动新的;~/.android挂载是为了共享设备授权信息,避免容器每次启动都要重新授权设备。调整套接字权限(关键)
主机上的ADB套接字默认可能只有启动它的用户能访问,容器内的用户(通常是root或者其他非主机用户)没有权限读取这个套接字,所以会连接失败。可以临时修改套接字权限来测试:
sudo chmod 777 /tmp/adb.sock
如果是生产环境,你可以更严谨一点——找出主机ADB进程的用户组,然后把容器内的用户加入这个组,但777是最快验证的方式。
确保ADB版本兼容
容器内的ADB版本必须和主机的ADB版本匹配,否则会出现"version mismatch"的错误。分别在主机和容器内执行adb version检查版本号,要是不一致,就在容器里安装和主机相同版本的ADB工具。验证效果
在主机上执行adb kill-server && adb start-server重启ADB服务器,然后进入容器内执行adb devices,这时候应该就能看到两台设备的列表了,主机上也能正常识别设备,不会再出现冲突。
这样设置后,主机和容器就共享同一个ADB服务器,再也不会出现"主机启动服务器容器就看不到设备"的问题了。
内容的提问来源于stack exchange,提问作者gad_gadskiy




