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

容器化 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)

分享創造快樂