如同多數使用 Docker 容器來部署應用的團隊一樣 , 山姆鍋也使用 Docker-compose 啟動一組相關的容器來進行整合測試 。 這樣的測試會在開發者工作機以及持續整合主機上執行 。 但是 , 如果您跟山姆鍋一樣使用 Shippable 這家 CI 服務的話 , 您可能同樣會遇到一些小麻煩 。

雖說山姆鍋很推薦使用 Circle CI 的服務 , 可惜的是它尚不支援 BitBucket [1] 。 回到現實是 Shppable 目前沒有支援在建構容器中 (build container) [2] 執行 docker-compose 的功能 , 所以 , 只好自己想辦法安裝 。

注意 : 本文使用的是 Shippable 的 Golang 建構容器 , 其它不知道有沒有同樣問題 。

安裝 docker-compose

「 這個會有多難 ?」, 一開始山姆鍋是這樣想的 。 只要使用 pip, 按照下列命令就可以安裝了 :

sudo pip install docker-compose

當然是要在 shippable.yml 中設定 , 細節請自行參考 Shippable 的文件 。 實際執行建構後 , 會遇到第一個問題 :pyconfig.h 找不到 , 無法編譯 PyYAML 套件 。 看來少了開發 Python 原生 (native) 套件的支持 , 問題不大 。

安裝 python-dev 系統套件

為了能夠安裝 PyYAML Python 套件 , 需要安裝 python-dev 這個系統套件 , 使用下列指令安裝 :

sudo apt-get install python-dev

再次執行建構發現 ,PyYAML 已經可以安裝 ,docker-compose 套件也同樣安裝正常了 , 應該沒有問題了吧 ?! 正期待一切順利進行的時候又冒出了一個問題 , 翻譯成中文大意是 :

您的 Docker engine 的版本過舊 ,docker-compose 要求須使用 1.10 以後的版本 。

檢查 Shippable CI 使用的版本是 1.9.1, 升級 Shippable 的 Docker engine 是不用想 , 直覺就是安裝舊版的 docker-compose 來適配這個版本 。 就這樣一直試到 docker-compose 1.5.2, 才支援 Shippable CI 使用的 engine 版本 [3] 。 這樣總算沒問題了吧 ! 對 Docker-compose 夠熟的讀者應該會發現一個問題 :compose 1.5.2 只支援 v1 的語法 , 而使用新技術不落人後的山姆鍋自然是用 v2 來寫 docker-compose.yml。

改用 docker-compose.yml v1 語法

整個問題至此大致已算是解決 , 主要的折衷是只能使用 compose v1 的功能 。 由於 docker-compose 在開發流程中只用來部署開發與測試環境 , v1 語法也足夠使用 ( 雖然有些彆扭 )。 最終安裝 Docker-compose 的指令會類似下面片段 :

- sudo apt-get install python-dev
- sudo pip install docker-compose==1.5.2

小結

雖然不是很理想 , 但暫時先採取折衷方案 , 等有時間再換到新的 CI 服務或者等 Shippable CI 改進 。 山姆鍋的立場是很贊成持續整合與部署 , 所以 , 就算是手機應用同樣也是採用持續整合的開發流程 。 另外 ,Docker 容器技術根本是給後端開發人員的禮物 , 請多多利用 !


[1] 因為也使用同一家公司的其它服務 , 如 Jira, Confluence, HipChat, 為了整合性 , 只好使用 BitBucket。
[2] 每個建構工作 (build job) 都是在各自的容器內進行 。
[3]Docker-compose 1.6.x 的 release notes 說支援 1.9.1 以上的版本 , 但山姆鍋測試是不行 。