24.1 部署-交叉编译、压缩二进制文件、Docker容器

1. 交叉编译

Go语言的优越性之一是可在众多环境下运行,其中包括:

  • 操作系统
    • windows、darwin、plan9、solaris、linux、netbsd/openbsd/freebsd、android
  • 体系架构
    • 386/amd64、arm/arm64、ppc64/ppc64le、mips/mipsle/mips64/mips64le

使用go env命令可以查看当前系统环境。

  • 64位Windows 10
    • GOOS=windows
    • GOARCH=amd64
  • 32位Ubuntu 16
    • GOOS=linux
    • GOARCH=386

所谓交叉编译,是指在任意平台上基于一份源代码,编译生成可运行于其它任意平台的二进制可执行文件。

在执行go build命令时,设置以下两个环境变量:

  • 通过GOOS指定目标操作系统
  • 通过GOARCH指定目标体系架构

在64位Windows 10上编译生成可运行于32位Ubuntu 16的可执行文件:

  • GOOS=linux GOARCH=386 go build main.go

在32位Ubuntu 16上编译生成可运行于64位Windows 10的可执行文件:

  • GOOS=windows GOARCH=amd64 go build main.go
// 交叉编译
// 执行如下命令,分别为32和64位Windows操作系统构建可执行程序:
// 
// GOOS=windows GOARCH=386 go build -o win32.exe main.go 
// GOOS=windows GOARCH=amd64 go build -o win64.exe main.go 
package mainimport ("fmt""unsafe"
)func main() {var i int fmt.Println(unsafe.Sizeof(i))
}
// 打印输出:PS > ./win32.exe4PS > ./win64.exe8

 2. 压缩二进制文件

发布Go语言编译生成的二进制可执行程序非常简单,其中包含了程序运行所需要的一切,因此无需考虑依赖问题。

  • 执行如下命令,构建原始大小的二进制文件:
    • go build -o large.exe main.go

即便是不足1KB的源代码文件(如main.go),编译生成的可执行文件(如large.exe)也高达近1.9MB。

  • Go语言编译生成的可执行文件中包含了整个Go语言运行时环境,虽然其体积较大,但它不需要任何依赖,就能在编译时指定的目标平台上直接运行。
  • 编译时指定省略符号表调试信息DWARF表,得到的可执行文件会略小一些(1.3MB)。
    • go build -o medium.exe -ldflags="-s -w" main.go 

如果希望得到更小的可执行文件,可以考虑使用二进制压缩工具UPX,但这样得到的可执行文件在运行时会先自动解压缩,因此启动时间会稍长

  • 执行如下命令,借助UPX工具将可执行文件进一步压缩至478KB:
    • upx -o small.exe medium.exe

注:针对windows系统,upx5.91以上版本才可以兼任64为.exe文件的压缩。

压缩二进制可执行文件大小的重要性取决于程序的部署场景。

  • 经高速网络部署到服务器上的可执行程序,通常无需考虑大小问题
  • 部署在存储空间有限的硬件设备上的可执行程序,当然是越小越好
  • 通过包管理器下载的命令行工具,文件大小的重要性介于二者之间

Go语言设计小组正在不懈努力,以进一步压缩编译器生成的二进制可执行文件的体积,每推出一个新版本,可执行文件的字节数都会有所下降。

// 压缩二进制文件
// 执行如下命令,构建原始大小的二进制文件:
// go build -o large.exe main.go 
// 执行如下命令,在构建过程中省略符号表、调试信息和DWARF表,以压缩二进制文件的大小:
// go build -o medium.exe -ldflags="-s -w" main.go 
// 执行如下命令,借助UPX工具对二进制文件做进一步压缩:
// ./upx/upx -o small.exe medium.exe
package main
import ("fmt""unsafe"
)func main() {var i int fmt.Println(unsafe.Sizeof(i))
}

3. Docker容器

Docker是一种在虚拟机中运行应用程序的流行方式,它提供了一种轻量级的方式,可确保无论计算机使用的是哪种操作系统和硬件架构,应用程序都能在完全相同的环境中运行。

Docker使用容器来确保应用程序位于操作系统的沙箱环境之中,其开销比完整的虚拟机要小。

通过Docker可以建立部署管道,这意味着开发人员只需将源代码提交到仓库,几分钟后它们就以可执行文件的形式,被自动发布到基于不同操作系统和硬件架构的生产环境之中。

Docker可用于WindowsLinuxmacOS等操作系统。

Go语言官方网站维护着一些Docker映像,可以直接在里面编译代码并运行。

// web服务器
// 侦听8000端口的Web服务器 
package mainimport "net/http"func rootHandler(w http.ResponseWriter,r *http.Request) {w.Write([]byte("Hello World!"))
}func main() {http.HandleFunc("/", rootHandler)http.ListenAndServe(":8000", nil)
}

基于Go语言的Web服务器已开发完成,准备部署到生产环境。

  • main.go

编写一个Docker文件,包含以下内容:

  • 将Go语言源代码文件复制到容器中
  • 编译Go语言源文件得到可执行文件
  • 暴露该Go语言服务器的侦听端口号

执行如下命令,在本地计算机上构建映像

  • docker build -t server-go

执行如下命令,在本地计算机上运行容器

  • docker run -p 8000:8000 server-go:latest

执行如下命令,查看容器标识并关闭容器

  • docker ps
  • docker stop <容器标识>

// Docker文件
FROM golang:1.9
COPY main.go /		-- 复制main.go到docker容器的根目录
RUN go build -o /server /main.go	-- 对main.go在docker虚拟机环境中进行编译
EXPOSE 8000		--暴露容器的8000端口
ENTRYPOINT ["/server"]	--容器的执行入口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

穿越时空的金星奥秘:揭秘古代天文学的惊人成就

在浩瀚的历史长河中&#xff0c;人类对宇宙的探索从未停止。而在中国古代&#xff0c;一项惊人的天文发现&#xff0c;至今仍让世界为之惊叹。那就是西汉时期的《五星占》&#xff0c;一部揭示金星会合周期的珍贵文献&#xff0c;其精确度之高&#xff0c;足以令现代天文学家瞠…

【AI基础】大模型资源整理

开局一张图&#xff0c;全靠硬凑&#xff1a; 硬拼一个雷达图&#xff1a; AI大模型&#xff0c;这是核心智能助手&#xff0c;基于大模型搭建的拿来就用的成熟应用平台应用分享&#xff0c;基于大模型搭建的拿来就用的小应用AI开发&#xff0c;基于大模型开发小应用 学习资源…

容器之分栏窗体构件演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

智慧园区解决方案PPT(53页)

## 1.1 智慧园区背景及需求分析 - 智慧园区的发展历程包括园区规划、经济、产业、企业、管理、理念的转变&#xff0c;强调管理模式创新&#xff0c;关注业务综合化、管理智慧化等发展。 ## 1.2 国家对智慧园区发展的政策 - 涉及多个国家部门&#xff0c;如工信部、住建部、…

抖音开放平台代开发小程序,上传模板代码

大家好&#xff0c;我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题&#xff0c;一套模板&#xff0c;随处部署。能尽可能地减少服务商的开发成本&#xff0c;服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…

Service方法增加@Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException

Service方法增加Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException 场景处理方法原因 场景 首先确认的是Service添加了Service或Component等注解&#xff0c;另外也增加了ComponentScan确定扫描的包路径是包含对应Service的&#xff0c;但就是无法找到这个bean。 通…

开放式耳机怎么选?五款劲爆机型强势PK!2024推荐版!

身为健身达人&#xff0c;我对耳机的要求可不低。开放式耳机让我在健身时既能享受音乐&#xff0c;又能清晰听到教练的指导。它佩戴舒适&#xff0c;不易掉落&#xff0c;而且音质出色&#xff0c;让我沉浸于运动的节奏中。市面上开放式耳机种类繁多&#xff0c;我为大家挑选了…

Omnivore:全能开源稍后阅读神器,让文字爱好者畅享阅读乐趣!

热门开源项目推荐 项目地址&#x1f517;&#x1f517;&#x1f517;&#x1f517; https://gitcode.com/omnivore-app/omnivore/overview Omnivore&#xff1a;全能开源稍后阅读神器 Omnivore App 介绍 Omnivore是一个完整的开源稍后阅读解决方案&#xff0c;专为喜欢文字…

【HarmonyOS NEXT】鸿蒙 如何在包含web组件的页面 让默认焦点有效

页面包含web组件Button组件等&#xff0c;把页面的默认焦点放到Button组件上&#xff0c;不起效果。 因为web组件默认会在组件加载完成后获取焦点&#xff1b; 可以在web的网页加载完成时onPageEnd回调中&#xff0c;将设置默认获焦的组件通过focusControl.requestFocus方法主…

自动备份SQL Server数据库,试试这4种方法!

各种规模的企业都使用 SQL 数据库来存储数据。因此&#xff0c;备份 SQL Server 数据库对于确保数据安全并在发生灾难时可恢复至关重要。对于 SQL 数据库备份&#xff0c;有多种可行的方法&#xff0c;对于特定组织来说&#xff0c;方法将取决于其具体需求。 SQL Server 备份的…

噪声-降噪引脚如何提高系统性能

由于LDO是电子器件&#xff0c;因此它们会自行产生一定量的噪声。选择低噪声LDO并采取措施来降低内部噪声对于生成不会影响系统性能的清洁电源轨而言不可或缺。 识别噪声 理想的 LDO 会生成没有交流元件的电压轨。遗憾的是&#xff0c;LDO 会像其他电子器件一样自行产生噪声。…

解决linux下载github项目下载不下来,下载失败, 连接失败的问题

第一步&#xff1a;打开/etc/hosts文件 linux vim /etc/hosts 第二步&#xff1a;文件拉到最下面&#xff0c;输入以下内容 linux #GitHub Start 140.82.113.3 github.com 140.82.114.20 gist.github.com 151.101.184.133 assets-cdn.github.com 151.101.184.133 raw.githubus…

2024会展行业发展趋势预测

在当今这个数字化浪潮汹涌的时代&#xff0c;会展行业也迎来了自己的变革时刻。 根据《2023中国会展主办机构数字化调研报告》&#xff0c;我们可以清晰地看到几个显著的趋势&#xff1a; 首先&#xff0c;数字化转型已经不再是一道选择题&#xff0c;而是必答题。 超过90%的…

Word中删除空白页

① 文字后面出现的空白页 把鼠标放在空白页的位置&#xff0c;按住Ctrl Delete即可。 ② 表格后面的空白页 把鼠标放在空白页左侧&#xff0c;直到出现一个空白的箭头&#xff0c;点击一下选中空白页&#xff0c;然后再Ctrl D&#xff0c;打开字体选项卡&#xff0c;在效果中…

Zabbix 监控 Kubernetes 集群

Zabbix 监控 Kubernetes 集群 Zabbix作为一个成熟且功能强大的监控系统&#xff0c;被许多企业广泛采用。它能够对各种IT基础设施进行全面的监控&#xff0c;包括服务器、网络设备、应用程序等。而将Zabbix与Kubernetes结合&#xff0c;可以实现对Kubernetes集群的全面监控&am…

“打造智能售货机系统,基于ruoyi微服务版本生成基础代码“

目录 # 开篇 1. 菜单 2. 字典配置 3. 表配置 3.1 导入表 3.2 区域管理 3.3 合作商管理 3.4 点位管理 4. 代码导入 4.1 后端代码生成 4.2 前端代码生成 5. 数据库代码执行 6. 点位管理菜单顺序修改 7. 页面展示 8. 附加设备表 8.1 新增设备管理菜单 8.2 创建字…

使用上海云盾 CDN 和 CloudFlare 后 Nginx、 WordPress、 Typecho 获取访客真实 IP 方法

最近因为被 DDoS/CC 攻击的厉害,明月就临时的迁移了服务器,原来的服务器就空置下来了,让明月有时间对服务器进行了重置重新部署安装生产环境。因为站点同时使用了上海云盾和 CloudFlare(具体思路可以参考【国内网站使用国外 CloudFlare CDN 的思路分享】一文)两个 CDN 服务…

实验13 简单拓扑BGP配置

实验13 简单拓扑BGP配置 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种用于自治系统间的动态路由协议&#xff0c;用于在自治系统&#xff08;AS&…

映射文件中#{}里的其他属性

#{}里除了可以写接收参数的名称外&#xff0c;还可以设置javaType&#xff0c;jdbcType&#xff0c;mode&#xff0c;numericScale,resultMap,typeHandler,jdbcTypeName这些属性的。 其他的属性除mode&#xff08;存储过程相关讲到存储过程的时候在讲&#xff09;外使用方式都…

openEuler 22.03 (LTS-SP1)服务器用ntpd同步GPS时间服务器的案例

本文记录了openEuler 22.03 (LTS-SP1)的二级时间服务器用chronyd不能自动同步GPS时间服务器&#xff0c;改用ntpd同步GPS时间服务器成功的案例 一、环境简述 1、本环境中有两台GPS一级时间服务器&#xff0c;IP如下&#xff1a; 192.168.188.66 192.168.188.74 2、有一台o…