写在前面
昨天上午“起早”到附近的影院看《波西米亚狂想曲》,选的座位比较靠前,最后的二十分钟里愣是没好意思把裤兜里的纸巾掏出来 ????。未来打算用三到五年的时间去开创自己的事业,想必道路不会平坦,不过认真做事的态度不变,大概率这段人生会有一个“酣畅淋漓”的收尾吧。
本文是我在思考“如何组建团队”时候的一个小尝试,旨在通过容器技术(docker)降低探索 Golang 技术开发的门槛。目前的效果还不是很明显,不过作为一种新思路,非常值得大家了解。
适用人群
入门√——初级——中级——高级,本文适合所有对技术感兴趣的开发者。
容器化 Go 开发环境
容器化的价值
搭建开发环境往往是一个啰嗦繁杂的过程。对职业开发者如此,对知识学习者和探索者亦如此。
职业编码工作中,代码编辑测试完成后部署到生产环境,需要按照自己本地的开发环境重新配置生产环境的机器。由于本地开发环境的搭建比较随性,往往,本地能够跑起来的代码部署到生产环境后跑不起来,或并未达到预期的运行效果。
对于一个刚刚开始学习 《C 语言程序设计》课程的大学生来说,编译出自己的 “Hello World” 往往意味着很多事先的准备工作(至少先把课堂上老师三言两语带过的开发环境搭建起来)。
之前因为项目的需要我魔改过日志收集工具 fluent/fluent-bit ,这是一个主要由 C
语言进行开发的项目,而我对 C
语言的认识还停留在大学课堂的水平,更何况我本地没有搭建过开发 C 的环境。
容器化技术能很好地解决上面的问题。职业开发者使用 Docker(容器化技术的一种)把环境搭建的过程封装到容器里,并以镜像的形式复制到生产环境得以“复现”相同的环境。作为知识学习者,完全可以利用相似的技术“复现”老师课堂上使用的环境。而作为知识探索者,在修改了 fluent-bit 的源码后,我利用其源码中提供的 Dockerfile 很方便地实现了定制化源码的编译,快速验证了思路可行性及定制化功能的可用性。
如果读者未使用过 Docker,可以参考《如何用一个例子上手docker》这篇博客的内容及其参考中列出的地址了解并尝试一下,应该会被甜到。
容器化的 Go 开发环境
为了说明问题并方便读者能容易地在自己机器上验证,我在《Go 反序列化 JSON 字符串的两种常见用法》和 《浅谈 Go 标准库对 JSON 的处理效率》两篇博客里刻意贴了完整而冗长的源码内容。虽说 package
和 import
语句对博客的内容并没有任何作用,但是如果因为多这样几句内容就能让代码成为完整可运行的源码,从而节省读者自己构造完整源代码的时间,我认为是值得且必要的。
可以把思考更进一步,如果读者朋友没有 Go 开发环境(或者与作者本地的开发环境不一致),如何才能以一种低成本的方式开始这一切呢?不知不觉就想到了 Docker 技术(都是套路????)。
定制化 Go 开发环境镜像
想要低成本获取 Go 开发环境,思路很简单,把 Go 开发环境打包到容器里(其实 官方 已经存在这种镜像),大家只需要拉取相应的镜像然后运行就可以了。如下面的源码所示,为了方便编辑并调试 Go 源码,我在 Go 官方镜像的基础上安装并简单配置了 vim
和 delve
,并把镜像推送到了 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 开发环境镜像
- 拉取镜像:
docker pull chalvern/golang:1.12
- 以 privileged 方式运行镜像:
docker run -it --privileged chalvern/golang:1.12 bash
- 此时便有了一个 Go 开发环境。
环境(上下文)一致的必要性
我在学生时代发现一个很有趣的现象,国外的教材往往页码很足整本书很厚,而中文的教材页码比较少相对要薄一些。排除一部分语言表达力的因素,主要是因为国外的教材喜欢包含比较多知识之外的细节。
以《C 语言程序设计》类似的书籍来说,是直接从 Hello World
讲起好呢?还是从详细的环境搭建步骤讲起好呢?我记得当年在学习 C 语言编程的时候,为了搭建开发环境到图书馆找了很多资料,最终也未“复现”教科书上一模一样的开发环境,导致在学习过程中产生非常多的疑惑。有的同学在疑惑面前退缩了,渐渐失去了编码的兴趣,最终的成绩自然也不如人意。
国外教材比较厚重的另一个原因,是国外教材中喜欢包含比较详细的参考文献。那么,书籍或者博客中,是否应该把参考文献放进正文呢?我认为是必要的。把参考文献列出来,一方面可以表达对相关论点提出者的尊重,另一方面则方便让读者能够进一步了解论点的渊源或者进一步考证“真相”。书里或博客里所论述的是“集百家之长的一家之言”呢?还是纯碎个人思考得出来的“一家之言”呢?不同的分类,其说服力以及可采纳率其实是不一样的;如果混淆在一起使人不可分辨,容易让人忽视共识的力量,
小结
本文尝试通过容器技术(docker)降低探索 Golang 技术开发的门槛。相比于把开发环境直接安装到自己的电脑上“尝鲜”,容器化技术能够很好地避免 Go 开发环境及其依赖项(比如 $GOPATH
、$GOROOT
等变量)对电脑的污染,同时容器化技术能够很好地“复现”一致可用的开发环境,避免引入其他变量,从而降低技术探索的难度。
参考
- 以认真的态度做完美的事情(2018年总结) - 敬维 之前写的 2018 年的总结
- Docker基本原理简析 - 敬维 简单介绍了 docker 涉及到的三种技术:Namespace、CGroup与AUFS
- 如何用一个例子上手docker - 敬维 用一个例子来上手使用 docker。
- GitHub - fluent/fluent-bit 轻量级日志收集应用
- Go 反序列化 JSON 字符串的两种常见用法 - 敬维 两种反序列化 JSON 字符串的方法,包含了复制黏贴即可运行的源码
- 浅谈 Go 标准库对 JSON 的处理效率 - 敬维 探究 Go 标准库对 JSON 的处理效率,包含了复制黏贴即可运行的源码
有疑问加站长微信联系(非本文作者)