go环境搭建_容器化 Go 开发环境的尝试

Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!

32fbfdbdd9a50a095be158905a1e5776.png

01 写在前面

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

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

02 适用人群

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

03 容器化 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 。

368491b4a06c54d72a7fdb2044510f1e.png

运行 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 语言编程的时候,为了搭建开发环境到图书馆找了很多资料,最终也未“复现”教科书上一模一样的开发环境,导致在学习过程中产生非常多的疑惑。有的同学在疑惑面前退缩了,渐渐失去了编码的兴趣,最终的成绩自然也不如人意。

国外教材比较厚重的另一个原因,是国外教材中喜欢包含比较详细的参考文献。那么,书籍或者博客中,是否应该把参考文献放进正文呢?我认为是必要的。把参考文献列出来,一方面可以表达对相关论点提出者的尊重,另一方面则方便让读者能够进一步了解论点的渊源或者进一步考证“真相”。书里或博客里所论述的是“集百家之长的一家之言”呢?还是纯碎个人思考得出来的“一家之言”呢?不同的分类,其说服力以及可采纳率其实是不一样的;如果混淆在一起使人不可分辨,容易让人忽视共识的力量,

04 小结

3b87866d4980a1f297ba2a09f8051ae7.png

本文尝试通过容器技术(docker)降低探索 Golang 技术开发的门槛。相比于把开发环境直接安装到自己的电脑上“尝鲜”,容器化技术能够很好地避免 Go 开发环境及其依赖项(比如 $GOPATH、$GOROOT 等变量)对电脑的污染,同时容器化技术能够很好地“复现”一致可用的开发环境,避免引入其他变量,从而降低技术探索的难度。

05 参考

  • 以认真的态度做完美的事情(2018年总结) - 敬维 之前写的 2018 年的总结
  • Docker基本原理简析 - 敬维 简单介绍了 docker 涉及到的三种技术:Namespace、CGroup与AUFS
  • 如何用一个例子上手docker - 敬维 用一个例子来上手使用 docker。
  • GitHub - fluent/fluent-bit 轻量级日志收集应用
  • Go 反序列化 JSON 字符串的两种常见用法 - 敬维 两种反序列化 JSON 字符串的方法,包含了复制黏贴即可运行的源码
  • 浅谈 Go 标准库对 JSON 的处理效率 - 敬维 探究 Go 标准库对 JSON 的处理效率,包含了复制黏贴即可运行的源码

著作权归作者所有。

原文: https://jingwei.link/2019/03/24/docker-golang-development.html

本文作者:敬维,原创授权发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值