前面学习了一些 docker 建立 container,image 的基础知识,然后当然要实践一下啦。加上之前研究 crosswalk 时找到它的 webdriver 执行文件只能在 linux 环境下跑,所以就拿它来练手了。
在 Docker 的学习中可以发现它的一大好处是能比较方便地把本来只能在 linux 上跑的程序拿到非 linux 系统中跑(当然实际上还是在 linux 中跑的),因此我在实践时就选用了本来只能在 linux 下跑的 crosswalk 的 webdriver : xwalkdriver。
镜像已上传到 docker hub ,因此在 docker 中直接 run 时就会自动下载镜像了。
此镜像及下面的说明仅针对真实设备,模拟器的连接后面还需要继续研究。
docker run -d -p 5037:5037 -p 5554:5554 -p 5555:5555 -p 9515:9515 -v /dev/bus/usb:/dev/bus/usb --privileged chenhengjie123/xwalkdriver
127.0.0.1:9595
。docker run -d -p 5037:5037 -p 5554:5554 -p 5555:5555 -p 9515:9515 -v /dev/bus/usb:/dev/bus/usb --privileged chenhengjie123/xwalkdriver
[boot2docker的ip地址]:9595
,其中 boot2docker 的 ip 地址可以通过 boot2docker ip
命令获得。xwalkdriver 脚本大致如下 (python):
# -*- coding:utf-8 -*-
import unittest
from selenium import webdriver
class TestCrossWalk(unittest.TestCase):
def setUp(self):
capabilities = {
'xwalkOptions': {
# App infos.
# The app MUST already installed on device
'androidPackage': 'com.HCCB.score',
'androidActivity': '.MainActivity',
'adb-port': 5037,
}
}
# use boot2docker, so set ip address to boot2docker ip
self.driver = webdriver.Remote('http://192.168.59.103:9515', capabilities)
def tearDown(self):
# end the session
self.driver.quit()
def test_login(self):
# sample for my own app. Please modify them before use.
print self.driver.page_source
self.driver.find_element_by_id("offlineBtn").click()
print self.driver.page_source
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TestCrossWalk)
unittest.TextTestRunner(verbosity=2).run(suite)
首先,要确认一下 xwalkdriver 的官方要求的依赖项:
阅读了这篇博文: adb client, adb server, adbd 原理浅析(附带我的操作过程) 后可以看出, adb 与真实设备/虚拟机进行连接使用的是 usb 和 tcp 连接。
而从官方的脚本例子可以看出,xwalkdriver 是以 server 形式存在的,脚本只要能连接到这个 server 就可以使用它了。从之前的学习看出端口映射这一部分 docker 已经简化到一个参数就能搞定了,所以难点主要在它的依赖项——adb——部分
简单总结下,主要难点是:
其中第二个难点目前还没搞定,所以下面的说明主要针对第一个难点。
要让 container 连接到真实设备,需要把真实设备直接连接到 container 中。由于所有设备在 Linux 中其实都是文件,所以我们可以使用 -v 参数来把 usb 设备映射到 container 中:-v /dev/bus/usb:/dev/bus/usb
。但由于 boot2docker 本身也是个 virtualbox 里面的虚拟机,所以还需要在 virtualbox 中把 usb 设备分配给虚拟机。
为了使用 adb ,我们需要一个装有 android sdk 的 image 。由于这个是普遍需求,所以 docker hub 上面有现成的可以使用。这里选用 webratio/android-sdk,里面包含了 adb,一些 build tool 以及 platform tool。具体有什么可以查看它的 Dockerfile
我们需要使用 git 来从 github 下载 crosswalk-web-driver ,并,因此需要安装 git :apt-get install git
为了方便在 container 中调试 usb 设备是否成功显示,因此安装 usbutils :apt-get install usbutils
(仅为了调试,实际使用可以不需要安装)
由于 docker 提供的 ubuntu 基本镜像里面缺少了很多动态链接库 ,导致调试过程中总是出现缺少 xx.so 文件的错误。随着不断地 google -> 添加文件 -> 新错误 -> google... ,终于把需要的 lib 补齐了:apt-get install libglib2.0-0 libnss3 libxi6 libgconf-2-4
至此,一个能够跑 xwalkdriver 的 container 已经搞定了。为了方便以后更改和版本化管理,我建立了一个 Dockerfile :
# Set the base image to ubuntu
FROM webratio/android-sdk
# File Author / Maintainer
MAINTAINER chenhengjie <chenhengjie123@gmail.com>
# Install git
RUN apt-get update
RUN echo y | apt-get install git
# Install lsusb
RUN echo y | apt-get install usbutils
# Install share libraries for xwalkdriver
RUN echo y | apt-get install libglib2.0-0 libnss3 libxi6 libgconf-2-4
# Install xwalkdriver
ENV XWALKDRIVER_URL https://github.com/crosswalk-project/crosswalk-web-driver.git
RUN cd /opt && \
git clone ${XWALKDRIVER_URL} && \
ls
# port expose
EXPOSE 9515 5037 5554 5555
# start adb server and check devices
# start xwalkdriver server and accept all ips
CMD adb devices && /opt/crosswalk-web-driver/bin/xwalkdriver64_release --verbose --whitelisted-ips 0.0.0.0
这里的命令用处大致如下:
命令 | 用处 |
---|---|
FROM | 从什么镜像开始执行后面的操作 |
MAINTAINER | 维护者信息 |
RUN | 运行命令。这个命令只有在 build 时会运行 |
EXPOSE | 需要映射的端口。在启动 container 时加入 -P 就会自动对这些端口进行映射 |
CMD | 运行命令。这个命令会在 run container 时运行 |
使用
docker run -d -p 5037:5037 -p 5554:5554 -p 5555:5555 -p 9515:9515 -v /dev/bus/usb:/dev/bus/usb --privileged chenhengjie123/xwalkdriver
命令启动。其中各参数的用处大致如下:
参数 | 用处 |
---|---|
-d |
以守护进程 (daemon) 形式运行 |
-p 5037:5037 |
端口映射。把 container 的 5037 端口映射到物理机(非 linux 系统则是 boot2docker 虚拟主机)的 5037 端口 |
-v /dev/bus/usb:/dev/bus/usb |
Mount 外部资源。这里是把物理机的 /dev/bus/usb 映射到 container 的 /dev/bus/usb 。由于 linux 系统中这个文件代表的就是所有 usb 资源,因此这样可以让虚拟机连接到物理机的 usb 设备 |
--privileged |
允许 container 连接物理设备。 |
如果使用 linux 虚拟机,也能以类似的方式实现 xwalkdriver ,但估计等待 android sdk 下载的时候这个 container 都已经可以跑起来了。由此可以看出 docker 面向交付的特点,让用户不用重复繁琐的环境搭建步骤,以最简便的方式完成环境配置。
这次虽然终于搞出来了,但还留了一些坑,如连接模拟器、Dockerfile 各命令具体用法。后续的学习需要把这些坑填掉,把 docker 的 container 间通讯、Dockerfile 用法、linux 容器的基本知识掌握。