Anschluss an USB-Android-Gerät in einem Docker-container via ADB
Habe ich einen Docker-image enthält das Android SDK, und ich versuche, um meine Android-Handy in einen Behälter läuft, dieses Bild. So habe ich das --privileged
Flagge montiert und die USB-Geräte wie folgt:
$ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-android:0.0.1
Aber wenn ich ADB devices wird es nicht angezeigt, mir das USB-Gerät:
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 im inneren des Behälters listet das Gerät:
ubuntu@d56b666be455:~$ lsusb
...
Bus 002 Device 017: ID 04e8:6866 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (debugging mode)
Das Gerät ist jedoch sichtbar auf dem host:
⇒ ./adb devices
List of devices attached
4d11abcd65b74045 device
Host-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 version
$ docker --version
Docker version 1.5.0, build a8a31ef
Was könnte das Problem sein?
- Ich glaube nicht, dass der adb-daemon läuft, kann das im Gerät angeschlossen werden, um zwei adb-Server. Versuchen Sie, trennen Sie es von Ihrem host-Maschine adb und dann verbinden Sie es mit dem Andockfenster ' s adb.
- Genial! Das scheint der Grund dafür zu sein. Ich getrennt, die host-Maschine, die adb und es funktionierte gut. Danke! Sie können post eine Antwort, damit kann ich markieren Sie es als die richtige Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass der ADB-daemon läuft auf dem Gerät kann angeschlossen werden, um zwei ADB-Server. Versuchen Sie, trennen Sie es von Ihrem host-Maschine ADB und schließen Sie es dann an die Docker-Containers ADB.
Während ich versuchte das gleiche, ich lief in einige andere Probleme im Zusammenhang mit, dass, würde ich mag zu teilen, so dass andere können Ihre Zeit sparen:
Problem 1: lsusb nicht installiert wurde, in den container
In meinem Fall lsusb war nicht installiert, also habe ich es installiert mit dem nachstehenden Befehl:
Problem 2: nicht in der Lage, um zu sehen, das Gerät auch nach lsusb und ADB-SDK-installation
Müssen Sie starten Sie Ihren container mit den
-v
option, und ja, vergessen Sie nicht zu töten, den ADB-server wie bereits in einer der Antworten.Auf dem host:
Den Fall, dass jemand wollte es tun, von Grund auf, die ich geschrieben habe, einen blog-post dazu:
Wie die Verbindung von ADB-Geräten auf Linux-container
adb-kill server
für vermeiden die host-Hafenarbeiter blockieren die adb aus der cotainer.Diese nicht zu beantworten, die genaue Frage, die Sie waren, zu Fragen, aber nicht ansprechen, was Sie versucht haben zu erreichen - die Verbindung zu einem android-Gerät verbunden, um einen docker-host von einem adb-client ausgeführt wird, innerhalb eines docker-container. Ich bin auch für jeden, der versucht zu erreichen, die gleiche Sache (wie ich war).
Den adb-client unterstützt
-H
option, die sagt, wo sich die adb-server zu verbinden. Docker unterstützt den Hostnamen "host.Andockfenster.interne", die immer wieder Karten, um die IP-Adresse des docker-host. Vorausgesetzt, Ihr Gerät angeschlossen ist, um den docker-host, können Sie Folgendes tun, um Ihre Container-adb-client eine Verbindung zum adb-server auf dem docker host:adb -H host.docker.internal devices
Erreicht das Ziel, ohne zu mounten die USB-ports.
Referenz: https://developer.android.com/studio/command-line/adb
Update:
Vor kurzem habe ich gelernt, dass host.Andockfenster.intern ist nur auf unterstützten Docker für Mac in den Versionen 18.0 und höher.
host.docker.internal
? Ich habe versuchtdocker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id
zu bekommen-container IP-Adresse, dann versuchtadb -H 172.xx.x.x devices
ich habe diesen Fehler** Cannot start server on remote host error: cannot connect to daemon
.Update:
Landete ich mit --privilegiert und -v zum anzeigen der gesamten
/dev/bus/usb
- und Patch-adb zu akzeptieren, dass man die environment-variable geben Sie das root-USB-Geräte-Baum -/dev/bus/usb/001
etc.Dies erlaubt uns, die Verwendung der verschiedenen USB-Bussen für verschiedene Behälter für die unterschiedlichen Gruppen für das gleiche Telefon, und eine weitere Umgebungsvariable patch erlaubt unterschiedliche VID:PID-Listen für verschiedene Arten von Handy.
Wir versuchen zu reservieren, verschiedene USB-Busse auf verschiedene Docker-Container laufen TeamCity Kunden.
Jeder container muss ANDROID_ADB_SERVER_PORT-Einstellung auf einen anderen port (da wir nicht mit getrennten Netzwerken).
Dem host-Computer nicht ausgeführt werden kann
adbd
, da nur eineadbd
sprechen können, um ein Telefon zu einem bestimmten Zeitpunkt.Jeder container erhält eine der
/dev/bus/usb/xxx
Verzeichnisse, so können wir plug-Handys in bestimmten Containern.Wir haben die Synchronisierung der
/dev/bus/usb/xxx
- Verzeichnis alle paar Sekunden, um zu erlauben, hot-plugging und Neustarts - nur eine shell-Schleife, die auf dem host läufttar cf devxxx.tar /dev/bus/usb/xxx
,docker cp
zu übertragen, danndocker exec
entpacken im inneren des Containers/tmp
diff zu erkennen, Knoten zu löschen, undmv -n
zu bewegen, neue Knoten in.In der Tat, denn wir laufen auf Linux, können wir wahrscheinlich nur eingerichtet udev-Skripte, pro Howto ein Skript ausgeführt, wenn ein USB-Gerät eingesteckt in.