容器化 Go 开发环境的尝试

【编者的话】本文是我在思考“如何组建团队”时候的一个小尝试,旨在通过容器技术(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

 [size=16] vim[/size]
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 等变量)对电脑的污染,同时容器化技术能够很好地“复现”一致可用的开发环境,避免引入其他变量,从而降低技术探索的难度。 #参考 * 以认真的态度做完美的事情(2018年总结) - 敬维 之前写的 2018 年的总结 * Docker基本原理简析 - 敬维 简单介绍了 Docker 涉及到的三种技术:Namespace、CGroup与AUFS * 如何用一个例子上手Docker - 敬维 用一个例子来上手使用 docker。 * GitHub - fluent/fluent-bit 轻量级日志收集应用 * Go 反序列化 JSON 字符串的两种常见用法 - 敬维 两种反序列化 JSON 字符串的方法,包含了复制黏贴即可运行的源码 * 浅谈 Go 标准库对 JSON 的处理效率 - 敬维 探究 Go 标准库对 JSON 的处理效率,包含了复制黏贴即可运行的源码 原文链接:容器化 Go 开发环境的尝试

0 个评论

要回复文章请先登录注册