原文请戳这里:http://galoisplusplus.coding....php
前段时间本渣在作服务器端开发时,采用了Docker
做为解决方案的一部分,最初的动机主要是想用namespace
作环境隔离、用cgroups
作资源限制,却也切身体会到Docker
所带来的构建上的便利。故而本渣也回头去想以前cocos2d-x客户端的开发工做是否也能Docker
化,很快就找到了一个很适合采用Docker
的场景,那就是打apk包。从以前搭建cocos2d-x游戏开发环境的博文中不难发现,要搭建打包环境特别麻烦,不只须要下一堆软件包,并且安装Android SDK和NDK时还会遇到GFW的问题。也正是由于这个缘故,咱们团队只有最开始的三位老司机在开发机上搭好了这套环境,以后陆陆续续来的新人都没作过这项工做,因此平时打包也基本是在这几台开发机上。这简直太应该Docker
化了!有了一套配好打包环境的Docker
image,不再用担忧小鲜肉跑来要求打包、占用开发机了!并且还能够扔到服务器上去作,多省心啊!想一想就excited,因而本渣立刻就折腾起Dockerfile
来了!java
首先要肯定基础镜像。本渣一开始觉得,配置Linux
下的cocos2d-x打包环境须要在执行cocos2d-x代码里的build/install-deps-linux.sh
,而这个脚本须要用到Debian
系的包管理器,因此就选了Ubuntu
做为基础镜像。python
配置apk打包环境天然少不了下载须要的软件包。Ubuntu
的apt-get install
会询问用户是否安装软件包,在Dockerfile
中须要把这一交互性去掉,最好采用:linux
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y
有些人喜欢把DEBIAN_FRONTEND
设成ENV
,这样ENV
下面的命令就不用重复打DEBIAN_FRONTEND=noninteractive
:android
ENV DEBIAN_FRONTEND noninteractive RUN apt-get install -y
但根据Deploying Python with Docker的说法,这种作法是不推荐的,由于这会影响到容器使用,最好仍是对每条须要的命令单独设置环境变量。nginx
安装的几个软件包中少不了Java
,我用的是Oracle的而非openjdk
,因此须要用add-apt-repository
把Oracle的ppa加上,这又须要先安装add-apt-repository
:c++
# 更新软件包列表 RUN DEBIAN_FRONTEND=noninteractive apt-get update -qq # 安装add-apt-repository RUN DEBIAN_FRONTEND=noninteractive apt-get -y install python-software-properties software-properties-common # 安装Oracle Java RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections RUN echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections RUN DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:webupd8team/java \ && apt-get update -qq RUN DEBIAN_FRONTEND=noninteractive apt-get -y oracle-java6-installer
打包还须要ant
、以后下载SDK等须要wget
或curl
,这些软件包能够写在这句apt-get -y
后面,由于咱们不但愿Docker
image有太多layer。git
接下来就是下载Android SDK和设置相应的环境变量了。Android SDK和NDK的google下载连接是被墙的,能够换成国内相关镜像的连接。本渣是先下好这些包,而后在咱们内网nginx起了一个简单的静态页面,咱们内部再经过这个页面去下载就灰常快了XDgithub
# Install Android SDK ENV ANDROID_SDK_ROOT /opt/android-sdk-linux RUN cd /opt && wget -q https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz -O android-sdk.tgz \ && tar -zxvf android-sdk.tgz \ && rm -f android-sdk.tgz ENV PATH ${PATH}:${ANDROID_SDK_ROOT}:${ANDROID_SDK_ROOT}/tools RUN echo y | android update sdk --no-ui --all --filter platform-tools | grep 'package installed' RUN echo y | android update sdk --no-ui --all --filter extra-android-support | grep 'package installed' RUN echo y | android update sdk --no-ui --all --filter android-20 | grep 'package installed' RUN echo y | android update sdk --no-ui --all --filter build-tools-20.0.0 | grep 'package installed'
若是你须要用代理来绕过GFW,能够这么写:web
# NOTE: google is blocked by GFW in China, # So I use the proxy: http://android-mirror.bugly.qq.com:8080. # You can remove `--proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s` # in the following commands if you don't have to worry about this issue. RUN echo y | android update sdk --no-ui --all --filter platform-tools --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed' RUN echo y | android update sdk --no-ui --all --filter extra-android-support --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed' RUN echo y | android update sdk --no-ui --all --filter android-20 --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed' RUN echo y | android update sdk --no-ui --all --filter build-tools-20.0.0 --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 -s | grep 'package installed'
接下来就是安装Android NDK了,和SDK差很少。
# Install Android NDK ENV ANDROID_NDK_ROOT /opt/android-ndk-r10e ENV NDK_ROOT /opt/android-ndk-r10e RUN cd /opt && wget -q http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip -O android-ndk.zip \ && unzip -q android-ndk.zip \ && rm -f android-ndk.zip ENV PATH ${PATH}:${ANDROID_NDK_ROOT}
最后别忘了清理安装的软件包:
RUN apt-get clean
到了这一步,本渣就能够先把Docker
image构建起来,把cocos2d-x代码、quick-x代码和客户端代码做为host的三个volumn挂载到Docker
container里了。经试验发现还须要作以下配置:
PATH
里加入cocos2d-console/bin
的目录才能使用cocos
命令。cocos2d-console
须要安装python
。QUICK_V3_ROOT
环境变量中。php
,须要安装。lib32stdc++6
和lib32z1
才能正常打包。因而本渣就能够相应地在Dockerfile
中继续添加了,虽然试验的过程有点繁琐,但能够保证生成的Docker
image只包含须要的软件包,让image尽量小。
接下来就是如何继续优化了,例如以上须要从host挂载cocos2d-x代码和quick-x代码的volumn仍是比较烦。其中咱们彻底不必把整份cocos2d-x代码挂载进来,由于建立cocos2d-x项目时会把须要的源代码文件拷到项目目录里,因此咱们只须要其中的cocos2d-console
,配置好cocos
所在的目录到环境变量PATH
便可。最后我把cocos2d-console
和quick-x
的代码打包,放到以前的内网网页中,这样就有了一份只须要挂载项目代码目录就能进行apk打包的Dockerfile
啦!
还记得前面所提到的cocos2d-x代码里的build/install-deps-linux.sh
脚本吗?其实这个脚本仍是有交互,因此我也把它所实现的功能挪到了Dockerfile
中,其实也不外乎用apt-get
下载一些软件包和下载glfw
编译安装罢了。既然这个脚本并不是必须,那么基础镜像也就不必定非要Debian
系的系统了,小巧的Alpine
无疑才是更理想的基础镜像。不过,目前咱们主要是内网开发用,尚未压缩Docker
image体积的需求,本渣也就不打算从新用Alpine
折腾一遍了XD
Update:
我把一份通用的Dockerfile
放到了Github上,你也能够在Docker Hub拉取对应的Docker
镜像:
docker pull galoisplusplus/quick-x-apk-docker
这一Docker
镜像对不采用quick-x的cocos2d-x游戏打包也是能够用的,只须要把Dockerfile
中quick-x的部分去掉后进行构建便可。