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

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

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

安裝 docker-compose

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

1
sudo pip install docker-compose

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

安裝 python-dev 系統套件

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

1
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 的指令會類似下面片段:

1
2
- 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 以上的版本,但山姆鍋測試是不行。