Подключение к 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
в случае, если кто-то хотел сделать это с нуля, я написал сообщение в блоге на нем:
мы пытаемся выделить различные шины 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 в.