STF Mac 上用 docker 安装 openstf--一步一坑从入门到放弃

dynamite · 2018年03月23日 · 最后由 Haibo 回复于 2019年05月14日 · 3886 次阅读

开篇明义,要在 Mac 上 直接用 Docker 安装 stf 是无法以有线的方式连接手机的,各位施主苦海无边回头是岸。(这里只是说 直接 在 Mac 里用 Docker 安装 stf 无法使用, 并不是完全无法用 Docker 安装,只不过方法很蛋疼 😩

公司有台 iMac 暂时闲着,准备装个 stf 来把分散的安卓机器统一管理起来,经历过 node 和 npm 循环依赖无法升级的我看到如下那么多安装依赖时就浑身舒爽 ~~

本着能躺绝不坐着的偷懒精神,想用 Docker 来解决,以为几句docker pulldocker run 就能搞定,而且 Docker sandbox 的特性还能不污染主机。没想到 too young, too simple , sometimes 非常 naive 啊。
Docker pull 和 run 的过程不表,参考 STF 开发环境搭建与制作 docker 镜像过程 , 期间各种踩坑、改命令改参数、端口映射。好不容易打开 stf 的管理页面,满怀期望把手机插上后,发现无法找到设备。。。

问题并不在于 openstf/stf ,而是出在它的依赖 sorccu/adb 这个 Docker 版 adb 身上。

Mac 里的 Docker 其实是依附于 xhyve ,也就是一个 hypervisor VM 。xhyve 非常小巧,但是有个问题, 无法把 Mac 的 USB 映射到 Docker 里,所以 Docker adb 是无法透过 xhyve 访问到 Mac 的 USB 设备。 这也就导致千辛万苦折腾半天之后插上手机发现没有设备的惨剧 。

adbd 作者原话 No /dev/bus/usb virtualization on Mac OS Sierra

Unfortunately Docker on Mac does not support USB, since the underlying xhyve doesn't support it. The old boot2docker may have worked by tweaking VM settings.

I think the easiest (perhaps only?) way to get it to work would be to use a Linux VM and run docker there instead.

为这个标题进来的同学们看到这就可以出门左转 npm install 起来了。

不过如果因为各种原因无法直接安装 stf 或者跟我一样年假一天闲着也是闲着的,可以继续往下进入 Mac -> Ubuntu -> Docker -> stf 的蛋碎之旅

  1. Mac 安装 virtualbox ,继而安装 Ubuntu

    • 没什么特别,下 Ubuntu 镜像时用国内交大源,速度嗖嗖
      • 下载安装 VirtualBox_Extension_Pack, 支持 USB3.0
  2. Ubuntu 安装 Docker 并设置 repository 镜像源

    • 官方安装步骤
    • 如果使用 docker 命令碰到权限问题,可以参考 这里 把用户加入 docker 用户组, 就是 sudo usermod -a -G docker $USER 随后 log out 或重启
    • 小 tip , 国内网络环境导致 docker pull 的速度十分感人,所以设置镜像必不可少。但是网上的镜像设置都是去各种云网站,其实有 Docker 中国官方镜像加速, 速度非常快,Ubuntu Docker 把下面的命令加入 /etc/docker/daemon.json (如果没有该文件就 sudo vi 一个),然后重启 deamon 和 docker, Mac Docker 点击鲸鱼-> daemon -> Advanced 黏贴 -> Apply & Restart 即可 { "registry-mirrors": ["https://registry.docker-cn.com"] }
  3. 按照 STF 开发环境搭建与制作 docker 镜像过程 开心的玩耍

  4. 关闭 VM ,因为要改 VM 配置

    • 添加 USB 过滤把要连接的手机都加入(host 系统和 VM 会争抢 USB 设备,添加过滤让 VM 享有 USB 端口优先权),如下图
    • 网络 -> 端口转发 里把 VM 的端口映射到主机 Mac 上(端口 7100 是 stf web 端口,7110、7120、7400 是 websocket 的端口, 7500 暂时未知)
    • 给 Ubuntu 分配多点内存,否则卡的不行
  5. 保存,再启动 VM, 然后 docker run rethinkdb 等等启动 stf 服务, 这里要注意,如果用 docker-compose 来启动服务的话,rethinkdb 的启动要放在最先且留一点时间,否则因为 VM 资源少很可能 rethinkdb 还没有起来 stf 就来连接数据库导致报错了

  6. Mac 浏览器打开 localhost:7100 ,连上手机, 等待 stf 安装, 然后就可以玩耍啦

  7. 遗留问题

    • 从本机访问没问题,但是局域网内访问无法实时控制,看了下 websocket 的连接地址一直是 127.0.0.1 ,所以导致非 localhost 的机器都无法建立 websocket 连接, 不知道是因为 docker run stf 的时候没有配置好还是因为 VM 的网络应该设置成桥接模式,

感谢参加本次 ‘闲的蛋碎之旅’,本人初入 stf 门,文章可能有很多不完善之处,还请海涵并指教

共收到 3 条回复 时间 点赞

为啥一定要用 mac 来搭建,官网都说用 ubt 啦,做个 ubt 的 docker 镜像不更好么?而且你旨意一台 mac 带得起多少手机?

因为我已经说啦,公司有台闲置的 iMac,想做个 stf poc 看看是不是方便测试和开发使用。而且公司安卓手机数量不太多,stf 官方推荐的 60w USB hub 还是可以带起一些的

stf 每连接一台设备会创建一个 7400~7700 之间的端口作为 websocket 进行连接,除了 7400,其他的端口也要映射

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册