J'ai créé une image Docker contenant le SDK Android et j'essaie d'exposer mon téléphone Android dans un conteneur exécutant cette image. J'ai donc utilisé l'indicateur --privileged
et monté les périphériques USB comme suit:
$ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-Android:0.0.1
Cependant, lorsque j'exécute des périphériques ADB, le périphérique USB ne s'affiche pas:
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 à l'intérieur du conteneur répertorie le périphérique:
ubuntu@d56b666be455:~$ lsusb
...
Bus 002 Device 017: ID 04e8:6866 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (debugging mode)
Le périphérique est toutefois visible sur l'hôte:
⇒ ./adb devices
List of devices attached
4d11abcd65b74045 device
OS hôte
$ 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
Version Docker
$ docker --version
Docker version 1.5.0, build a8a31ef
Quel pourrait être le problème?
Je ne pense pas que le démon ADB exécuté sur le périphérique puisse être connecté à deux serveurs ADB. Essayez de le déconnecter de la base de données de votre ordinateur hôte, puis connectez-le à la base de données du conteneur Docker.
Tandis que j'essayais la même chose, j'ai rencontré d'autres problèmes liés à cela, que j'aimerais partager afin que d'autres puissent gagner du temps:
Problème 1: lsusb n'était pas installé dans le conteneur
Dans mon cas lsusb n'était pas installé, je l'ai donc installé avec la commande ci-dessous:
apt-get update
apt-get install usbutils
Problème 2: impossible de voir le périphérique même après l'installation du kit de développement logiciel (SDK) lb et ADB
Vous devez redémarrer votre conteneur avec l'option -v
et, oui, n'oubliez pas de tuer le serveur ADB comme indiqué dans l'une des réponses.
Sur l'hôte:
adb-kill server
docker run -ti -d --privileged -v /dev/bus/usb:/dev/bus/usb container_name
Au cas où quelqu'un voudrait le faire à partir de zéro, j'ai écrit un article de blog à ce sujet:
Cela ne répond pas à la question que vous posiez, mais répond à ce que vous tentiez d'accomplir - la connexion à un appareil Android connecté à un hôte de menu fixe à partir d'un client adb s'exécutant à l'intérieur d'un conteneur de menu fixe. J'inclus ceci pour tous ceux qui essaient d'accomplir la même chose (comme j'étais).
Le client adb prend en charge une option -H
qui lui indique où trouver le serveur adb auquel se connecter. Docker prend en charge le nom d'hôte "Host.docker.internal", qui correspond toujours à l'adresse IP de l'hôte de docker. En supposant que votre appareil soit connecté à l'hôte docker, vous pouvez procéder comme suit pour que votre client adb conteneurisé se connecte au serveur adb exécuté sur l'hôte docker:
adb -H Host.docker.internal devices
Accomplit l'objectif sans avoir à monter les ports USB.
Référence: https://developer.Android.com/studio/command-line/adb