做云市场行业的领导者
欢迎光临本网站
主页 > 新闻 > 腾讯云 >

为Go应用程序构大数据发展前景-建最小的Docker容器

发布时间:2020-11-07 05:31   来源:维塔尔云    作者:维塔尔云

为Go应用程序构建最小的Docker容器

编者按:这是Nick Gauthier的客座博客,经许可出版。它最初发布在CloudBees Codeship网站上,有许多官方和社区支持的容器,用于许多编程语言,包括Go,但是这些容器可能相当大。让我们来比较一下为Go应用程序构建容器的方法,点云,然后我将向您展示一种静态构建用于容器化的Go应用程序的方法小零件一:我们的"应用程序"我们需要一些东西来测试我们的应用程序,所以让我们做一些小的事情:我们将获取谷歌并输出html we获取:包主导入("fmt""io/ioutil""net/http""os")func main(){resp,错误:=http.Get("https://google.com)check(err)body,淘客推广,错误:=ioutil.ReadAll(责任主体)检查(错误)正式印刷品(len(body))}函数检查(err error){if err!=无{正式印刷品(错误)操作系统退出(1) }}如果我们运行这个,它将只打印出一些数字。对我来说,大约是17k,我有目的地决定用SSL做一些事情,原因我保证会解释晚点。部分2: Dockerize遵循官方的Docker形象,我们会写一个"onbuild"Dockerfile这个:哥朗的:onbuild"onbuild"映像假定您的项目结构是标准的,并将像普通Go应用一样构建应用程序。如果你想要更多的控制,你可以使用他们的标准Go-base映像并编译你自己:哥朗的:最新运行mkdir/app ADD。/app/WORKDIR/app RUN go build-o主程序。CMD/app/main"]如果你有一个Makefile或其他一些在构建应用程序时必须做的非标准的事情,这是很好的选择。我们可以从CDN下载一些资产,或者从另一个项目中添加它们,或者我们希望在集装箱你可以看到,DockerizingGo应用程序非常简单,尤其是我们没有任何服务或端口需要访问或导出。但官方形象有一个很大的缺点:它们实在太大了。我们来一杯看:存储库大小配置IDCREATEDexample-onbuildlatest9dfb1bbac2b819分钟agoexample-golanguationbuild3be7ee2ec1ae9天agogolangonbuild3be7ee2ec1ae9天agogolang1.4.2121a93c904639天agogolanglatest121a93c904639天基础是514.9MB,我们的应用程序只增加了5.8MB。真 的。所以对于我们编译的应用程序,我们仍然需要514.9MB的依赖关系?那是怎么发生的?答案是我们的应用程序是在容器内编译的。这意味着容器需要安装Go,这意味着它需要Go的依赖项,这意味着我们需要一个包管理器和一个完整的操作系统。事实上,如果你看看Dockerfile高朗:1.4,它从debianjessie开始,安装GCC编译器和一些构建工具,卷曲到Go并安装它。所以我们几乎有一个完整的Debian服务器和gotoolkit来运行我们的小应用程序。我们能做什么?第三部分:编译!改进的方法是做一些…不走寻常路的事。我们要做的是在工作目录中编译Go,然后将二进制文件添加到容器中。这意味着一个简单的docker构建不起作用。我们需要一个多步骤容器建造:建造-o主管道。docker build-t示例scratch-fDockerfile.scratch文件. 以及Dockerfile.scratch文件是简单地说:从头开始添加主管道/CMD/main"]那么什么是scratch?Scratch是一个特殊的docker图像,它是空的。它是真正的0B:REPOSITORYTAGIMAGE idCreateDexSample-ScratchLatestCA1AD50C9256大约一分钟前ScratchLatest511136EA3C5A22个月前同样,我们的容器就是5.6MB!酷!但是有一个问题:$docker run-it示例没有这样的文件或目录?那是什么意思?我花了一段时间才弄明白,但是我们的Go二进制文件正在运行它的操作系统上寻找库。我们编译了我们的应用程序,返利商城,但它仍然动态链接到它需要运行的库(即,云报,它绑定到的所有C库)。不幸的是,scratch是空的,因此没有库和加载路径供它查找。我们要做的是修改我们的构建脚本,用内置的所有库静态编译我们的应用程序:CGO_ENABLED=0 GOOS=linux go build-a-installsuffix CGO-omain。我们还将操作系统设置为Linux(以防有人在Mac或Windows上构建此操作系统),-a标志意味着重建我们正在使用的所有包,这意味着所有导入都将在禁用cgo的情况下重建。这些设置在Go1.4中发生了变化,但我在GitHub问题上找到了解决办法。现在我们有了一个静态二进制!让我们来试试:$docker run-it示例scratch Gethttps://google.com:x509:加载系统根失败,并且没有提供根太好了,现在怎么办?这就是为什么我选择在我们的示例中使用SSL。对于这种情况,这是一个非常常见的问题:要发出SSL请求,我们需要SSL根证书。那么我们如何将这些添加到容器中呢?根据操作系统的不同,这些证书可以放在许多不同的地方。如果您查看Go的x509库,物联网大赛,您可以看到Go搜索的所有位置。对于许多Linux发行版,这是/etc/ssl/certs/ca-证书.crt. 首先,我们要复制ca-证书.crtfrom我们的机器(或者一个Linux虚拟机或者一个在线证书提供者)进入我们的存储库。然后我们将添加一个add到Dockerfile中,将这个文件放在Go期望的位置:FROM scratch add ca-证书.crt/etc/ssl/certs/ADD main/CMD/main"]现在只要重建我们的映像并运行它,它就可以工作了!酷!让我们看看我们的应用有多大现在:REPOSITORYTAGIMAGE IDCREATEDexample-scratchlatestca1ad50c9256About一分钟前示例-onbuildlatest9dfb1bbac2b819分钟agoexample-golanguatest02e19291523e19分钟agogolangonbuild3be7ee2ec1ae9天agogolang1.4.2121a93c904639天agogolanglatest121a93c904639天agogolanglatest511136ea3c5a22个月我们已经添加了一个略多于半个meg(而且大部分都是来自静态二进制文件,而不是根证书)。这是一个非常好的小容器-它将非常容易推拉之间注册。结论本文的目标是缩小Go应用程序的容器大小。Go的特殊之处在于它可以创建一个完全包含应用程序的静态链接二进制文件。其他语言可以做到这一点,但肯定不是所有语言都能做到。如果我们将这种减小容器大小的技术应用于其他语言,这将取决于它们的最低要求是什么。例如,可以在容器外部编译Java或JVM应用程序,然后将其注入只有JVM(及其依赖项)的容器中。这至少比一个有JDK的容器要小,我真的很期待社区在为容器来宾创建最小操作系统以及积极削减对各种语言的需求方面取得的进展。公共Docker hub最大的优点是可以与所有人共享很容易。链接要获得更多资源了解如何通过将应用程序转换为单独的容器来实现更好的CI/CD阅读DevOps和continuous delivery如何转变业务了解CloudBees DevOptics如何提供CI/CD平台监控见解

上一篇:主要收获:从剧本云的服务器-启示录中幸存下来
下一篇:没有了

分享到:
0
最新资讯
阅读排行