容器化 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]。
# 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 语言编程的时候,为了搭建开发环境到图书馆找了很多资料,最终也未“复现”教科书上一模一样的开发环境,导致在学习过程中产生非常多的疑惑。有的同学在疑惑面前退缩了,渐渐失去了编码的兴趣,最终的成绩自然也不如人意。
国外教材比较厚重的另一个原因,是国外教材中喜欢包含比较详细的参考文献。那么,书籍或者博客中,是否应该把参考文献放进正文呢?我认为是必要的。把参考文献列出来,一方面可以表达对相关论点提出者的尊重,另一方面则方便让读者能够进一步了解论点的渊源或者进一步考证“真相”。书里或博客里所论述的是“集百家之长的一家之言”呢?还是纯碎个人思考得出来的“一家之言”呢?不同的分类,其说服力以及可采纳率其实是不一样的;如果混淆在一起使人不可分辨,容易让人忽视共识的力量。
小结
相关链接:
https://github.com/fluent/fluent-bit
https://jingwei.link/2018/06/30/how-to-play-docker-simplly.html
https://jingwei.link/2019/03/15/golang-json-unmarshal-using.html
https://jingwei.link/2019/03/16/golang-json-performance.html
https://hub.docker.com/_/golang
https://github.com/chalvern/smile
原文链接:https://jingwei.link/2019/03/24/docker-golang-development.html
基于Kubernetes的DevOps实践培训
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/026c6cc95420fd07cf47a4db908c41af.jpeg)