歡迎光臨
每天分享高質量文章

容器化 Go 開發環境的嘗試

本文是我在思考“如何組建團隊”時候的一個小嘗試,旨在透過容器技術(Docker)降低探索 Golang 技術開發的門檻。目前的效果還不是很明顯,不過作為一種新思路,非常值得大家瞭解。
容器化 Go 開發環境

 

容器化的價值
搭建開發環境往往是一個囉嗦繁雜的過程。對職業開發者如此,對知識學習者和探索者亦如此。
職業編碼工作中,程式碼編輯測試完成後部署到生產環境,需要按照自己本地的開發環境重新配置生產環境的機器。由於本地開發環境的搭建比較隨性,往往,本地能夠跑起來的程式碼部署到生產環境後跑不起來,或並未達到預期的執行效果。
對於一個剛剛開始學習 《C 語言程式設計》課程的大學生來說,編譯出自己的 “Hello World” 往往意味著很多事先的準備工作(至少先把課堂上老師三言兩語帶過的開發環境搭建起來)。
之前因為專案的需要我魔改過日誌收集工具 fluent/fluent-bit[1],這是一個主要由 C 語言進行開發的專案,而我對 C 語言的認識還停留在大學課堂的水平,更何況我本地沒有搭建過開發 C 的環境。
容器化技術能很好地解決上面的問題。職業開發者使用 Docker(容器化技術的一種)把環境搭建的過程封裝到容器裡,並以映象的形式複製到生產環境得以“復現”相同的環境。作為知識學習者,完全可以利用相似的技術“復現”老師課堂上使用的環境。而作為知識探索者,在修改了 fluent-bit 的原始碼後,我利用其原始碼中提供的 Dockerfile 很方便地實現了定製化原始碼的編譯,快速驗證了思路可行性及定製化功能的可用性。
如果讀者未使用過 Docker,可以參考《如何用一個例子上手 Docker[2]》這篇部落格的內容及其參考中列出的地址瞭解並嘗試一下,應該會被甜到。
容器化的 Go 開發環境
為了說明問題並方便讀者能容易地在自己機器上驗證,我在《Go 反序列化 JSON 字串的兩種常見用法[3]》和 《淺談 Go 標準庫對 JSON 的處理效率[4]》兩篇部落格裡刻意貼了完整而冗長的原始碼內容。雖說 package 和 import 陳述句對部落格的內容並沒有任何作用,但是如果因為多這樣幾句內容就能讓程式碼成為完整可執行的原始碼,從而節省讀者自己構造完整原始碼的時間,我認為是值得且必要的。
可以把思考更進一步,如果讀者朋友沒有 Go 開發環境(或者與作者本地的開發環境不一致),如何才能以一種低成本的方式開始這一切呢?不知不覺就想到了 Docker 技術。
定製化 Go 開發環境映象
 
想要低成本獲取 Go 開發環境,思路很簡單,把 Go 開發環境打包到容器裡(其實官方[5]已經存在這種映象),大家只需要拉取相應的映象然後執行就可以了。如下麵的原始碼所示,為了方便編輯並除錯 Go 原始碼,我在 Go 官方映象的基礎上安裝並簡單配置了 vim 和 delve,並把映象推送到了 Docker Hub 倉庫中。更詳盡的內容可以參考 GitHub – chalvern/smile[6]。
  1. # cat https://github.com/chalvern/smile/blob/master/docker/Dockerfile
  2. FROM golang:1.12
  3. ## vim
  4. RUN apt-get update \
  5. && apt-get install -y vim \
  6. && rm -rf /var/lib/apt/lists/*
  7. # vim setting
  8. COPY vimrc /root/.vimrc
  9. RUN go get -u github.com/derekparker/delve/cmd/dlv
  10. WORKDIR $GOPATH
 
執行 Go 開發環境映象
  1. 拉取映象:docker pull chalvern/golang:1.12

  2. 以 privileged 方式執行映象:docker run -it –privileged chalvern/golang:1.12 bash

  3. 此時便有了一個 Go 開發環境。

環境(背景關係)一致的必要性
我在學生時代發現一個很有趣的現象,國外的教材往往頁碼很足整本書很厚,而中文的教材頁碼比較少相對要薄一些。排除一部分語言表達力的因素,主要是因為國外的教材喜歡包含比較多知識之外的細節。
以《C 語言程式設計》類似的書籍來說,是直接從 Hello World 講起好呢?還是從詳細的環境搭建步驟講起好呢?我記得當年在學習 C 語言程式設計的時候,為了搭建開發環境到圖書館找了很多資料,最終也未“復現”教科書上一模一樣的開發環境,導致在學習過程中產生非常多的疑惑。有的同學在疑惑面前退縮了,漸漸失去了編碼的興趣,最終的成績自然也不如人意。
國外教材比較厚重的另一個原因,是國外教材中喜歡包含比較詳細的參考文獻。那麼,書籍或者部落格中,是否應該把參考文獻放進正文呢?我認為是必要的。把參考文獻列出來,一方面可以表達對相關論點提出者的尊重,另一方面則方便讓讀者能夠進一步瞭解論點的淵源或者進一步考證“真相”。書裡或部落格裡所論述的是“集百家之長的一家之言”呢?還是純碎個人思考得出來的“一家之言”呢?不同的分類,其說服力以及可採納率其實是不一樣的;如果混淆在一起使人不可分辨,容易讓人忽視共識的力量。
小結

 

本文嘗試透過容器技術(Docker)降低探索 Golang 技術開發的門檻。相比於把開發環境直接安裝到自己的電腦上“嘗鮮”,容器化技術能夠很好地避免 Go 開發環境及其依賴項(比如 $GOPATH、$GOROOT 等變數)對電腦的汙染,同時容器化技術能夠很好地“復現”一致可用的開發環境,避免引入其他變數,從而降低技術探索的難度。
相關連結:
  1. https://github.com/fluent/fluent-bit

  2. https://jingwei.link/2018/06/30/how-to-play-docker-simplly.html

  3. https://jingwei.link/2019/03/15/golang-json-unmarshal-using.html

  4. https://jingwei.link/2019/03/16/golang-json-performance.html

  5. https://hub.docker.com/_/golang

  6. https://github.com/chalvern/smile

原文連結:https://jingwei.link/2019/03/24/docker-golang-development.html

已同步到看一看
贊(0)

分享創造快樂