通过容器技术降低探索 Golang 技术的门槛

写在前面

昨天上午“起早”到附近的影院看《波西米亚狂想曲》,选的座位比较靠前,最后的二十分钟里愣是没好意思把裤兜里的纸巾掏出来 👀。未来打算用三到五年的时间去开创自己的事业,想必道路不会平坦,不过认真做事的态度不变,大概率这段人生会有一个“酣畅淋漓”的收尾吧。

本文是我在思考“如何组建团队”时候的一个小尝试,旨在通过容器技术(docker)降低探索 Golang 技术开发的门槛。目前的效果还不是很明显,不过作为一种新思路,非常值得大家了解。

适用人群

入门√——初级——中级——高级,本文适合所有对技术感兴趣的开发者。

容器化 Go 开发环境

容器化的价值

搭建开发环境往往是一个啰嗦繁杂的过程。对职业开发者如此,对知识学习者和探索者亦如此。

职业编码工作中,代码编辑测试完成后部署到生产环境,需要按照自己本地的开发环境重新配置生产环境的机器。由于本地开发环境的搭建比较随性,往往,本地能够跑起来的代码部署到生产环境后跑不起来,或并未达到预期的运行效果。

对于一个刚刚开始学习 《C 语言程序设计》课程的大学生来说,编译出自己的 “Hello World” 往往意味着很多事先的准备工作(至少先把课堂上老师三言两语带过的开发环境搭建起来)。

之前因为项目的需要我魔改过日志收集工具 fluent/fluent-bit ,这是一个主要由 C 语言进行开发的项目,而我对 C 语言的认识还停留在大学课堂的水平,更何况我本地没有搭建过开发 C 的环境。

容器化技术能很好地解决上面的问题。职业开发者使用 Docker(容器化技术的一种)把环境搭建的过程封装到容器里,并以镜像的形式复制到生产环境得以“复现”相同的环境。作为知识学习者,完全可以利用相似的技术“复现”老师课堂上使用的环境。而作为知识探索者,在修改了 fluent-bit 的源码后,我利用其源码中提供的 Dockerfile 很方便地实现了定制化源码的编译,快速验证了思路可行性及定制化功能的可用性。

如果读者未使用过 Docker,可以参考《如何用一个例子上手docker》这篇博客的内容及其参考中列出的地址了解并尝试一下,应该会被甜到。

容器化的 Go 开发环境

为了说明问题并方便读者能容易地在自己机器上验证,我在《Go 反序列化 JSON 字符串的两种常见用法》和 《浅谈 Go 标准库对 JSON 的处理效率》两篇博客里刻意贴了完整而冗长的源码内容。虽说 packageimport 语句对博客的内容并没有任何作用,但是如果因为多这样几句内容就能让代码成为完整可运行的源码,从而节省读者自己构造完整源代码的时间,我认为是值得且必要的。

可以把思考更进一步,如果读者朋友没有 Go 开发环境(或者与作者本地的开发环境不一致),如何才能以一种低成本的方式开始这一切呢?不知不觉就想到了 Docker 技术(都是套路😀)。

定制化 Go 开发环境镜像

想要低成本获取 Go 开发环境,思路很简单,把 Go 开发环境打包到容器里(其实 官方 已经存在这种镜像),大家只需要拉取相应的镜像然后运行就可以了。如下面的源码所示,为了方便编辑并调试 Go 源码,我在 Go 官方镜像的基础上安装并简单配置了 vimdelve,并把镜像推送到了 Docker Hub 仓库中。更详尽的内容可以参考 GitHub - chalvern/smile

# cat https://github.com/chalvern/smile/blob/master/docker/Dockerfile
FROM golang:1.12

## vim
RUN apt-get update \
  && apt-get install -y vim \
  && rm -rf /var/lib/apt/lists/*

# vim setting
COPY vimrc /root/.vimrc

RUN go get -u github.com/derekparker/delve/cmd/dlv

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 等变量)对电脑的污染,同时容器化技术能够很好地“复现”一致可用的开发环境,避免引入其他变量,从而降低技术探索的难度。

参考