原文請戳這裏: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的部分去掉後進行構建便可。