Mac M1环境下Docker容器中adb install卡住问题求助
问题背景
基于ruby:latest镜像构建的Docker容器已安装android-sdk,主机(Apple M1芯片 macOS Ventura 13.0)执行adb devices可识别物理设备,容器内通过adb -H host.docker.internal devices也能正常列出设备,但容器内执行adb -H host.docker.internal install myapp.apk时会卡在Performing Streamed Install步骤,主机执行该操作则正常。已尝试--privileged启动容器无效,Windows主机下该容器可正常运行。需求是通过GitLab Runner触发操作,复用主机已验证的adb指纹,避免重复验证。
解决方案
确保主机与容器adb版本一致
主机执行adb version,容器内执行adb -H host.docker.internal version,确认两者版本完全匹配(包括主版本和补丁号)。版本不匹配会导致远程传输的兼容性问题,若不一致,在容器内安装与主机相同版本的adb。调整adb传输缓冲区大小
在容器内执行安装命令时增加--buffer-size参数,缩小传输缓冲区,避免M1 Docker网络环境下的数据包阻塞:adb -H host.docker.internal install --buffer-size=65536 myapp.apk拆分推送与安装步骤
绕过流式安装的传输逻辑,先将APK推送到设备临时目录,再远程执行安装:# 推送APK到设备 adb -H host.docker.internal push myapp.apk /data/local/tmp/ # 远程执行安装 adb -H host.docker.internal shell pm install /data/local/tmp/myapp.apk使用host网络模式启动容器
启动容器时指定--network host参数,让容器直接复用主机网络栈,无需通过host.docker.internal转发adb请求:docker run --network host -it your-ruby-android-image之后容器内直接执行
adb devices和adb install myapp.apk即可,自动复用主机已验证的指纹。注意M1 macOS上Docker的host网络模式需确保容器运行在Linux模式下,可在Docker Desktop设置中开启“Use the new Virtualization framework”提升兼容性。检查macOS防火墙与安全设置
- 在「系统设置-网络-防火墙」中确认Docker Desktop被允许通过防火墙;
- 临时关闭第三方安全软件,测试是否解决传输拦截问题。
内容的提问来源于stack exchange,提问作者thibsc

