Подключение к USB-устройству Android в контейнере Docker через ADB

Я создал образ Докера, который содержит 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

в чем может быть проблема?

3 ответов


Я не думаю, что демон ADB, работающий на устройстве, может быть подключен к двум серверам ADB. Попробуйте отключить его от ADB вашего хост-компьютера, а затем подключить его к ADB контейнера Docker.


в то время как я пытался то же самое, я столкнулся с некоторыми другими проблемами, связанными с этим, которые я хотел бы поделиться, чтобы другие могли сэкономить свое время:

Проблема 1: lsusb не был установлен в контейнер

В моем случае lsusb не был установлен, поэтому я установил его с помощью следующей команды:

apt-get update
apt-get install usbutils

Проблема 2: не удается увидеть устройство даже после установки lsusb и ADB SDK

вам нужно перезапустите контейнер с помощью -v опция, и да, не забудьте убить сервер ADB, как указано в одном из ответов.

на хозяина:

adb-kill server
docker run -ti -d --privileged -v /dev/bus/usb:/dev/bus/usb   container_name

в случае, если кто-то хотел сделать это с нуля, я написал сообщение в блоге на нем:

Как подключить устройства ADB к контейнеру Linux


мы пытаемся выделить различные шины USB для различных контейнеров Docker работает TeamCity клиенты.

каждому контейнеру требуется настройка 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, мы, вероятно, можем просто настроить udev-скрипты, per как запустить скрипт, когда USB-устройство это pluged в.