如何分析Alpine里的go应用

86次阅读
没有评论

共计 2038 个字符,预计需要花费 6 分钟才能阅读完成。

丸趣 TV 小编今天带大家了解如何分析 Alpine 里的 go 应用,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着丸趣 TV 小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着丸趣 TV 小编一起深入学习“如何分析 Alpine 里的 go 应用”的知识吧。

我们刚接触 Docker 时,最常见的入门方式是使用 Ubuntu 或 Debian 等系统构建虚拟机,这种方式的弊端是产生的镜像太大了,单单是 Ubuntu 的基础镜像就已经有 187.9MB,而且大部分装好的软件和依赖库都不会用到。

容器和虚拟机的主要区别在于,容器在宿主系统的一个隔离进程空间里边运行,因此它不需要有独立的内核和其他系统文件,只要在上边安装你需要使用的东西,我们会需要 Python 来运行 Go 的服务吗?这不是一个很难回答的问题。

微基础镜像

  首先我们要抛弃使用 Ubuntu 或者 Debian 作为基础镜像这种思路,我们着眼于更轻量的选择。

[Alpine Linux]是一个微型的 Linux 分发版,可以用来构建一个体积只有 5M 的基容器,它是基于一个嵌入式系统 [BusyBox] 改造的。那为什么不直接用 BusyBox 呢?使用 Alpine 有几个优点,首先,Alpine 上有一个包管理系统 code apk /code,使用它可以简化容器的维护;第二,Alpine 的内核已经被打上[PaX 补丁],可以免受大量 0 day 漏洞的侵害。

你可以在以下列表看到,Alpine 只在 BusyBox 的基础上增加了 4.1MB 的体积,但是同时相应增加了那些便利,我觉得这部分开销非常值得。

| 镜像   | 体积   |
| :——– | :–: |
| ubuntu  | 187.90 MB  |
| nicholasjackson/microservice-basebox  |  15.82 MB  |
| alpine  | 5.24 MB  |
| busybox  |  1.10 MB  |

为 Alpine Linux 编译 Go 应用

使用 Go 来构建微服务的一个优点是,它会被编译成二进制包,这样的话,它就不需要框架或者运行依赖,这样非常有利,因为正如前面所说 Alpine 是一个非常轻量级的分发版,并不是所有 C 语言依赖库都有安装,所以 Go 的动态库依赖很可能也没有。所幸的是有专门的方法去禁用了 cgo 依赖,可以把应用通过链接的方式编译,我们只需要这样告诉编译器去重新构建我们的所有应用包就可以了:
“`sh
$ CGO_ENABLED=0 go build -a -installsuffix cgo .
“`
我们更详细说一下上边这个命令的细节:
CGO_ENABLED=0 是一个编译标志,会让构建系统忽略 cgo 并且静态链接所有依赖;
- a 会强制重新编译,即使所有包都是由最新代码编译的;
-installsuffix cgo 会为新编译的包目录添加一个后缀,这样可以把编译的输出与默认的路径分离。

运行应用

那么在二进制包里怎么使用配置文件呢,如果你是在使用微服务架构,那你很可能在使用 [Consul],如果还没有的话,那你真的应该好好研究一下它,它确实很强大。在本文中,我会假定你已经熟悉 Consul,你在使用这个[Consul 模板] 去管理你的配置文件。

我们通常需要使用监护进程来运行这些服务,例如[Supervisor],不过这个工具需要使用 Python,这样有违我们轻量级的初衷,所以我们使用[Skaware S6]。

S6 是一个简单有效的工具,它使用 code /etc/s6 /code 下的配置文件,来启动 s6-svscan 进程。你可以从我的 [基镜像仓库] 中看到,这个目录下包含了一系列的 shell 脚本。

.S6-svscan

这个目录包含两个脚本 crash 和 finish,当 s6 所管理的应用由于错误终结时,crash 脚本会被调用,当 s6 进程关闭时,finish 脚本会被调用。

Spp

这个目录包含 run 和 finish 两个脚本,run 用来启动主服务,并且会被配置上 Go 应用的执行路径。而在 finish 中可以设置应用程序关闭时要执行的脚本。

Consul-template

这个目录同样也是包含了那两个脚本,但是这次它是用来配置 consul-template 应用的,consul-template 生成微服务所用到的配置文件,相关配置文件会被储存在 Consul 服务端上,在 Go 微服务的整个生命周期中,Consul 应用都需要运行着提供配置服务,所以我们也要通过 s6 来监控守护它。

Docker 基础镜像

为了方便测试,我已经使用 Alpine 来构建了一个带有 Skaware S6 和 Consul Template 的镜像,这个 [新的镜像] 也是只有 15.82MB。即使你基于这个镜像构建一个再臃肿的应用,那也估计不过 30MB 左右,但是这样还是只有一个 Ubuntu 基础镜像体积的 13%。

感谢大家的阅读,以上就是“如何分析 Alpine 里的 go 应用”的全部内容了,学会的朋友赶紧操作起来吧。相信丸趣 TV 丸趣 TV 小编一定会给大家带来更优质的文章。谢谢大家对丸趣 TV 网站的支持!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计2038字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)