我创建了一个Docker镜像,其中包含Android SDK,并试图在运行此镜像的容器中暴露我的Android手机。因此,我使用--privileged
标志并安装USB设备,如下所示:
$ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-android:0.0.1
但是,当我运行ADB设备时,它不显示USB设备:
ubuntu@d56b666be455:~/Android/Sdk/platform-tools$ ./adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
ubuntu@d56b666be455:~/Android/Sdk/platform-tools$
容器中的lsusb列出了设备:
ubuntu@d56b666be455:~$ lsusb
...
Bus 002 Device 017: ID 04e8:6866 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (debugging mode)
但是,该设备在主机上可见:
⇒ ./adb devices
List of devices attached
4d11abcd65b74045 device
主机OS
$ uname -a
Linux ananya 3.16.0-33-generic #44~14.04.1-Ubuntu SMP Fri Mar 13 10:33:29 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Docker版本
$ docker --version
Docker version 1.5.0, build a8a31ef
会是什么问题呢?
8条答案
按热度按时间ne5o7dgx1#
我不认为在设备上运行的ADB守护程序可以连接到两个ADB服务器。尝试将其与主机的ADB断开连接,然后将其连接到Docker容器的ADB。
webghufk2#
当我在尝试同样的方法时,我遇到了一些与此相关的其他问题,我想分享这些问题,以便其他人可以保存时间:
问题一:容器中未安装lsusb
在我的例子中,lsusb没有安装,所以我用下面的命令安装了它:
问题二:即使安装了lsusb和ADB SDK,也无法看到设备
您需要使用
-v
选项重新启动您的容器,是的,不要忘记杀死ADB服务器,如其中一个答案所述。在主机上:
如果有人想从头开始,我写了一篇博客文章:
How to connect ADB devices to Linux container
vh0rcniy3#
这并没有回答你所问的确切问题,但确实解决了你试图完成的事情-从运行在docker容器内的adb客户端连接到连接到docker主机的android设备。我包括这对任何人试图完成同样的事情(像我一样)。
adb客户端支持
-H
选项,该选项告诉它在哪里找到要连接的adb服务器。Docker支持主机名“host.docker.internal”,它总是Map到Docker主机的IP地址。假设你的设备连接到了docker主机,你可以执行以下操作来让你的容器化adb客户端连接到docker主机上运行的adb服务器:adb -H host.docker.internal devices
无需安装USB端口即可实现目标。
参考:https://developer.android.com/studio/command-line/adb
更新:我最近了解到,host.docker.internal仅在18.0及以上版本的Docker for Mac上受支持。
xxslljrj4#
只运行
--privileged -v /dev/bus/usb:/dev/bus/usb
对我来说不起作用。我尝试使用-p 5037:5037
转发adb守护进程的侦听端口,但也没有帮助。只有在我添加了
--net host
之后才能工作。这意味着主机的网络接口会暴露给docker,所以如果你没问题的话,就使用它。可能除了5037之外还有更多的端口需要转发....f0brbegy5#
这对我很有效。
$ adb devices
我尝试了很多选择,只有一个可行。使用
--network
标志作为下一个示例$ docker run -it --net host ubuntu bash
产出:
使用this Dockerfile。是为Flutter项目
5us2dqdw6#
更新:
我最终使用--privileged和-v来Map整个
/dev/bus/usb
,并修补adb以接受一个环境变量来指定根USB设备树-/dev/bus/usb/001
等。这允许我们为同一电话的不同组的不同容器使用不同的USB总线,另一个环境变量补丁允许不同类型的电话使用不同的VID:PID列表。
我们尝试将不同的USB总线分配给运行TeamCity客户端的不同Docker容器。
每个容器都需要将ANDROID_ADB_SERVER_PORT设置为不同的端口(因为我们没有使用隔离网络)。
主机不能运行
adbd
,因为在任何给定时间只有一个adbd
可以与电话通话。每个容器获取一个
/dev/bus/usb/xxx
目录,因此我们可以将电话插入特定的容器。我们必须每隔几秒钟同步
/dev/bus/usb/xxx
目录,以允许热插拔和重新引导-只需在主机上运行tar cf devxxx.tar /dev/bus/usb/xxx
,docker cp
来传输它,然后docker exec
在容器的/tmp
中解压缩,diff检测要删除的节点,mv -n
移动新节点。事实上,因为我们运行在Linux上,我们可能只需要按照 * Howto run a script when a USB device is pluged in * 设置udev脚本。
gxwragnw7#
不好意思我太过分了。但是我不能回答这个问题,所以我把它写在这里。
我正在使用ubuntu:18.04并试图连接我的三星Galaxy A3 2016并使用ADB进行调试。设备未经授权,屏幕上没有弹出对话框!
我是如何解决这个问题的:
我感兴趣的是,这个问题还会在Docker容器中发生吗?答案是“不!“.
1.在Docker容器中,我使用以下命令调用:(这是本主题的答案:))
1.我下载了platform-tools(与ADB一起分发)。添加了其环境路径。并重新启动了bash
1.在Docker容器内重新启动ADB服务器并在主机上杀死ADB服务器后。我发现确认对话框出现在智能手机的屏幕上!
所以在主机上,我认为问题在
.android
目录中。把它移到.android-backup
。下一个adb start-server
命令将创建一个新的。另外,我将platform-tools
文件夹替换为最新的neekobn88#
添加--device=/dev/bus/usb:/dev/bus/usb -v /etc/udev:/etc/udev optiopn以通过Docker容器中的USB访问ADB设备