在Docker Cloud上實作GeoDjango

新人運維血淚史

Posted by silau on September 20, 2019

我們後端用的是GeoDjango 配合PostGIS,Docker有提供原生的PostGIS鏡象,所以PostGIS可以很方便地解決,但GeoDjango 就要面對另外幾個考慮了。

目前Docker流行使用Alpine Linux作為內核,因為生成的Image Size更細,但正正因為Alpine 太精簡了,經常會遇上軟體建構(build)的問題,最經典的難題就是安裝Python的Numpy跟Pandas。簡單而言Alpine 並沒有提供可以直接安裝的Binary檔,所以用家要自行安裝build tools,並且由source code來進行安裝,中間還要解決不同軟件的dependency問題 ,同時為了保持Alpine的精簡,在安裝完畢之後還要將不再使用的build tools移除。

嚴格來說我成為後端開發員也只是半路出家,對IT 運維更加是從未入行,突然要處理binary packages,build tools,build dependency,BUILD,MAKE,gcc,g++這些火星內容,還是感到有點吃力。所幸的是,借助於新時代的工具,我們在IT Infrastructure上節省了很多的工作,Docker的出現也幫我們抽象了很多概念。

在Alpine Linux上安裝Pandas跟Numpy的問題算是很普遍,所以網絡上也有很多不同的方案可供選擇。但是在Alpine Linux安裝GeoDjango(包括GEOS,PROJ.4以及GDAL)卻是另一個故事,安裝過程比較複雜,使用的build tools更多,build dependency的內容更多,而且簡單又可靠的方案幾乎沒有。比較有希望的內容是Alpine Linux下一個版本將會支持原生的GEOS,PROJ.4以及GDAL,但那是後話,我們目前就要更新內容了。

考慮到這裡,以Alpine Linux作為基礎來架構會使我們陷入到舊時代IT Infrastructure的問題迴圈上,並且我們並非這方面的專家,難保在安裝完所有必須工具之後仍會出現千年蟲問題。所以目前的打算是以Python 3.7 (Ubuntu-based)做基礎,再安裝GeoDjango 所需的工具就好了,等到Alpine原生支持GDAL的時候再來多一次大改版。

我們會以Docker Cloud + GitHub來架構base image。

好消息是Docker Cloud已經支援Continuous integration (CI) 了,所以只要將Dockerfile push到github之上,Docker Cloud就會自動生成相關的映像檔。

以往個人常用的Repo是放在Bitbucket,這次終於有機會可以試用一下Github以及CI的威力。from source code to end profuduct,感覺很好,而且這個機制對於本機硬體規格不高的電腦也很有幫助。

製成品點我