首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

减小镜像体积-docker最佳实践

在90年代,通常使用静态链接方式static linking, 这意味着程序使用库将包含在最终二进制文件,在使用软盘分发程序和没有标准库情况下,这种方式十分方便, 但是在linux分时系统流行后...如今大部分情况下,使用动态链接。使用动态链接编译程序最终二进制文件不包含具体库,而只包含对依赖引用,例如一个程序需要libtrigonometry.socos和sin和tan函数。...回到上面的示例程序默认情况C使用动态链接,使用某些包Go程序也是如此,上述程序使用标准C库,该库位于libc.so.6文件, 所以需要在镜像包含该文件,C Hello World才能正常执行。...使用静态链接 我们可以使用静态链接,这取决于我们具体使用构建工具,如果使用gcc,可以通过-static实现静态链接: 1 gcc -o hello hello.c -static 最终构建二进制文件大小...alpine:5.6MB 静态链接,使用scratch:940KB 静态musl二进制文件,使用scratch:94KB 总结 优化镜像同时,能够帮助我们更好理解容器相关核心特性。

1.3K10

Go 静态编译及在构建 docker 镜像时应用

Go 语言具有跨平台和可移植特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上二进制可执行文件,这是因为 Go 在编译时支持将依赖文件与源代码一起编译链接二进制文件,所以在实际运行时不再需要依赖运行环境库...,而是使用相对位置表示,只有在被链接到应用程序才被确定最终在内存位置。...静态编译是在编译时就将依赖静态链接库复制到可执行文件,这样在应用程序运行起来后无需依赖外部库,只需要单一可执行文件即可运行,但缺点是应用程序体积相对较大,程序运行越多重复占用内存浪费越多。...Go 静态编译和动态编译例子 静态编译 Go 支持跨平台和可移植特性,默认使用静态编译 编译后可以通过 ldd(List Dynamic Dependencies) 命名查看可执行程序依赖动态链接库...C 语言目标文件,之后再编译 Go 代码得到 Go 语言目标文件最终Go 和 C 目标文件通过链接链接到一起得到最终可执行文件

200
您找到你想要的搜索结果了吗?
是的
没有找到

Go命令官方指南【原译】

使用需要非默认编译标志-buildmode选项 具有类似的效果。 -ldflags '[pattern =] arg list' 传递每个go工具链接调用参数。...SWIG 在列表,DIR表示目录最终路径元素,MAINFILE是构建程序包时未包含目录任何Go文件基本名称。...-buildmode = default 列出程序包内置于可执行文件,列出 非主程序包内置于.a文件默认 行为)。...即使是仅二进制包也需要准确导入块来列出所需依赖关系,以便在链接生成命令时可以提供这些依赖关系。请注意,此功能计划在Go 1.12发布后删除。...程序包不需要具有唯一包名,但有两个具有特殊含义保留包名。名称main表示命令,而不是库。命令内置于二进制文件,无法导入。名称文档表示目录中非Go程序文档。go命令会忽略包文档文件

8K30

深入浅出:Go语言编译原理与过程解析

静态链接和动态链接区别在编程链接是将编译器生成一个或多个目标文件(通常是 .o 文件)以及库文件合并成一个可执行文件过程。...链接可以是静态或动态,它们之间有几个关键区别:静态链接:在编译时发生,将所有必需库代码复制到最终可执行文件。生成可执行文件较大,因为它包含了所有依赖库代码。...可执行文件依赖于外部库文件,因此更容易分发。如果库更新,需要重新编译和链接应用程序以获取更新。动态链接:在运行时发生,可执行文件包含对共享库(如 .so 或 .dll 文件引用。...Go 语言链接过程特点Go 语言链接过程有一些独特特点,主要体现在以下几个方面:静态链接: Go 语言默认采用静态链接。...编译后 Go 程序通常包含了所有依赖库代码,这使得 Go 程序很容易分发和部署,因为它们不依赖于系统上共享库。简化部署: 由于 Go 程序通常是静态链接单个可执行文件,这简化了部署过程。

72130

Golang常用工具分享

gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能gofmt是一个独立cli程序,而go还有一个go fmt命令,go fmt命令是gofmt简单封装。...go vet命令是go tool vet命令简单封装。它会首先载入和分析指定代码包,并把指定代码包所有Go语言源码文件和以“.s”结尾文件相对路径作为参数传递go tool vet命令。...The GOOS and GOARCHenvironment variables set the desired target. 1.11.8 go tool buildid每一个 Go 二进制文件,...参考:https://www.kancloud.cn/cattong/go_command_tutorial/2613551.11.13 go tool link该命令链接Go归档文件比如静态库,以及链接其所有依赖.../299061.11.16 go tool pack该命令把二进制文件打包成静态库。

1.8K52

为 PHPer 准备 Go 入门知识

我还希望该应用程序可以独立包含在一个二进制文件,以便于分发和安装。我下载了 Go,对它易学性和在短时间内获得生产力感到惊讶。...bin 目录存放你下载二进制形式依赖 ,你可以将 bin 目录添加到你 PATH 环境变量里面。...学习 Golang , 你可以在终端运行命令 go get golang.org/x/tour/gotour 下载 Go 编程指南, go get 将下载参数里面指定第三方依赖源码和二进制文件。...} 所有 Go 程序起点是主程序主要功能。接下来,你可以跑 go run main.go 运行程序。...没有 try 或 catch 机制。作为替代,如果发生错误,需要从函数返回错误。Go 支持一个函数返回多个值。如果调用函数可能会返回错误,你必须检测这个错误是否存在,然后处理这个错误。

45810

十五条有用Golang编程经验

这些观点不一定就是对Golang批评。我能够在两周从对这个语言零基础到发布应用程序,我真是太牛逼了。...但是,很明显,简单静态二进制文件并不是Golang内在特性。如果你代码及其相关依赖全部是用Golang写,那么你可以用GOOS和GOARCH来构建静态二进制文件。...但是,要生成一个没有外部依赖关系静态二进制文件,需要确保所有的C依赖项(及其依赖项)都是静态链接。GOOS和GOARCH支持对应值组合表可以在Golang文档中找到。 如何进行测试?...测试数据放在一个特殊testdata目录。 使用go build时,testdata目录和_test.go文件都会被编译器忽略。...因此,当你运行go test时,默认情况下会发现它运行了所有依赖测试。使用go list | grep -v /vendor可以让Golang忽略vendor目录。 if err !

1.8K80

CC++生态工具链——gccg++编译器使用指南

2.编译 首先检查代码规范性和语法错误等,检查完毕后把代码翻译成汇编语言,生成汇编语言文件 3.汇编 基于汇编语言文件生成二进制格式目标文件 3.链接 将目标代码与所依赖文件进行关联或者组装,合成一个可执行文件...4.链接--将xx.o二进制文件进行链接最终生成可执行程序 g++ demo.o -o demo.out 五,静态链接和动态链接区别 静态库: 与目标程序合并,成为目标程序一部分。...目标程序静态链接时,目标程序代码调用任何外部函数代码都会从静态复制到最终可执行文件。.../lib,/usr/lib,/usr/local/lib等写在程序路径 动态库链接时,搜索库文件路径顺序: 1....默认动态库搜索路径/usr/lib 实用程序:ldd 和 nm ldd:列出依赖动态库 nm:查看动态库/静态函数 六,gcc/g++命令常见参数 命令格式 gcc [-c|

2.3K30

31个!Golang常用工具来啦(建议收藏)

gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能 gofmt是一个独立cli程序,而go还有一个go fmt命令,go fmt命令是gofmt简单封装。...go vet命令是go tool vet命令简单封装。它会首先载入和分析指定代码包,并把指定代码包所有Go语言源码文件和以“.s”结尾文件相对路径作为参数传递go tool vet命令。...The GOOS and GOARCHenvironment variables set the desired target. go tool buildid 每一个 Go 二进制文件,都有一个独一无二...参考: https://www.kancloud.cn/cattong/go_command_tutorial/261355 go tool link 该命令链接Go归档文件比如静态库,以及链接其所有依赖...articles/29906 go tool pack 该命令把二进制文件打包成静态库。

2.1K10

Go 1.16新特性-embed包及其使用

它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好程序,并提供访问这些文件能力。...静态资源访问没有io操作,速度会非常快。 最常见方法(例如静态网站后端程序)要求将程序连同其所依赖html模板,css,js和图片以及静态资源路径一起上传到生产服务器。...03 — embed常用场景 以下列举一些静态资源文件需要被嵌入到程序常用场景: Go模板:模板文件必须可用于二进制文件(模板文件需要对二进制文件可用)。.../main.go:8:5: invalid go:embed: multiple files for type string 软链接&硬链接 嵌入指令是否支持嵌入文件链接呢 ?...不同之处在于编译后二进制程序文件在运行过程是否依赖static目录静态文件资源。 以下为验证步骤: 首先,使用编译到二进制文件方式。

87100

2011年04月21日 Go生态洞察:Go在Heroku实践

幸运是,Go并发原语使得这个任务变得容易许多。 Go并发模型魅力 在Doozer,Paxos过程被实现为goroutines,它们通信通过channel操作。...例如,websocket包,一旦我们有了一个工作数据存储,就需要一种简单方法来内省它并可视化活动。利用websocket包,Keith可以在回家火车上添加web查看器,而无需外部依赖。...Go源代码格式化工具:gofmt gofmt是我们最喜欢提高生产力工具之一。我们从未因为代码格式问题而争论,因为我们都同意,gofmt默认输出是最终决定。...部署Doozer简便性 部署Doozer非常简单。Go构建静态链接二进制文件,这意味着Doozer没有外部依赖;它是一个可以复制到任何机器上并立即启动单一文件。...Websocket包 使得添加web查看器变得简单,无需额外依赖 gofmt 源代码格式化工具,避免格式争议 静态链接 产生没有外部依赖二进制文件,简化部署过程 代码简洁性 Go简洁性和正交性与Doozer

10710

为 PHPer 准备 Go 入门知识

我还希望该应用程序可以独立包含在一个二进制文件,以便于分发和安装。我下载了 Go,对它易学性和在短时间内获得生产力感到惊讶。...bin 目录存放你下载二进制形式依赖 ,你可以将 bin 目录添加到你 PATH 环境变量里面。...学习 Golang , 你可以在终端运行命令 go get golang.org/x/tour/gotour 下载 Go 编程指南, go get 将下载参数里面指定第三方依赖源码和二进制文件。...} 所有 Go 程序起点是主程序主要功能。接下来,你可以跑 go run main.go 运行程序。...没有 try 或 catch 机制。作为替代,如果发生错误,需要从函数返回错误。Go 支持一个函数返回多个值。如果调用函数可能会返回错误,你必须检测这个错误是否存在,然后处理这个错误。

1.4K20

Go 常用命令介绍

1.1 go build Go 是强类型编译型语言,因此编译时会将所有依赖编译进同一个二进制文件。...' 传递参数给5g, 6g, 8g 调用 -installsuffix suffix 为了和默认安装包区别开来,采用这个前缀来重新安装那些依赖包,-race时候默认已经是-installsuffix...当你运行 go install 时,它会编译当前目录 Go 代码,并将生成二进制可执行文件放置在你 Go 工作空间 bin 目录(通常位于 GOPATH )。...doc:显示包文档。 pprof:分析和查看分析数据。 trace:编译时跟踪工具。 link:链接器工具,查看二进制文件依赖。 addr2line:转换地址为文件/行号。...-ldflags:传递参数给链接器。 -trimpath:去除输出文件路径信息。 -memprofile:写入内存概要文件。 -cpuprofile:写入CPU概要文件

37820

Linux工具学习之【gccg++】

举例:libc.so 去掉前缀与后缀,最终为 c ,可以看出文件最终调用是C语言共享库,即 动态链接 动态链接 主要依赖不同函数在库位置信息进行调用,只有一份代码库,比较节省空间 我们还可以通过...install -y glibc-static 下载 静态库 当然我们也可以通过 ldd 最终生成文件 查看是否静态链接 $ yum install -y glibc-static //下载静态库...$ gcc test.c -o myfile-static -static //采取静态链接方式编译程序 $ ldd 最终生成文件 //查看文件链接方式 静态库 命名为 libXXX.a...lib 是前缀 .a 是后缀 去掉前缀与后缀,就是最终调用库 我们也可以采用 file 命令查看详细信息 $ file 文件 //查看详细信息 静态链接 因为是直接将需要代码拷贝到程序,因此最终生成文件会变大...,不需要重新编译程序 可以控制是否加载动态库,不调用函数时就不加载 缺点 需要调用函数,加载速度较慢 程序运行需要依赖动态库 静态库 优点 所需函数直接拷贝至程序,运行速度快 程序运行无需依赖

18120

Go类似,跟C一样快

新智元报道 编辑:元子 【新智元导读】V是最新出现一种静态编译型语言,用于构建可维护软件。它与Go类似,也受到Oberon、Rust、Swift影响。 开发者从来就不缺新语言。...对于V所有声明都是如此,并且不需要头文件或考虑文件和声明顺序。 V目标之一是向具有不同编译器开发经验开发人员开放。作者希望编译器不再是让人捉摸不透、只有极少数人才能理解黑盒子。 ?...parse()方法请求扫描程序为其需要解析文件生成令牌列表,然后逐个遍历所有的标记即可。 在V,可以在声明之前使用对象,因此有2次传递。在第一次传递期间,它只查看声明并跳过函数体。...即使对于GUI和图形应用程序,也无需额外步骤! 其他更多特性可以去官网阅读开发文档。 最终表现如何呢?...根据作者介绍,V和C一样快;C interop无需任何成本;分配数量最少;没有运行时反射内置序列化;编译本地二进制文件不需要任何依赖:一个简单Web服务器只有65KB。

1.3K40

Go打包和部署:从编译到运行全指南

基本命令命令含义go run编译并马上运行 go 程序(只接收 main 包下文件作为参数)go build编译指定文件、软件包及其依赖项,但它不会运行编译后二进制文件。...-n打印编译过程所有执行命令,但不执行生成二进制文件 -a强制重新编译所有涉及依赖...以保持输出与默认版本分开跨平台交叉编译Go语言支持跨平台交叉编译,允许我们在一个平台上编写代码,编译出在另一个平台上运行程序。...是否Go代码调用C代码GOOS目标操作系统 GOARCH目标操作系统架构 第三方打包工具Go语言还有一些第三方工具,可以帮助我们将非.go文件(如静态文件、模板文件等)打包到二进制文件...rev-parse HEAD`"在上述命令,通过 -ldflags 命令 -X 参数可以在链接时将信息写入变量,其格式为:package_name.variable_name=value查看编译后二进制文件和版本信息

64010

不要轻易使用 Alpine 镜像来构建 Docker 镜像,有坑!

在这部分内容,我会解释静态链接和动态链接区别,它们对镜像带来影响,以及如何避免那些不好影响。中间会穿插一部分对 Alpine 镜像介绍。...Go 语言镜像精简 Go 语言程序编译时会将所有必须依赖编译到二进制文件,但也不能完全肯定它使用静态链接,因为 Go 某些包是依赖系统标准库,例如使用到 DNS 解析包。...也就是说,如果 Go 程序使用了 net 包,就会生成一个动态二进制文件,如果想让镜像能够正常工作,必须将需要文件复制到镜像,或者直接使用 busybox:glibc 镜像。.../whatsmyip"] 由于编译生成静态二进制文件,因此可以直接跑在 scratch 镜像 ?...whatsmyip.go 这样指定之后,如果导入其他包都没有用到系统库,那么编译得到就是静态二进制文件

21.4K44

go build 交叉编译

go build 交叉编译 作者:matrix 被围观: 10 次 发布时间:2023-02-10 分类:Golang | 无评论 » Golang支持跨平台编译,比起python只能编译为当前平台二进制文件要好太多...默认编译(输出当前平台二进制文件) $ go build -ldflags="-s -w" main.go && upx -9 ....) -o 表示输出指定文件名(默认为main) -a 表示强制重新构建 -ldflags参数 `-s -w` 表示减小体积,去除编译携带符号表和调试信息 -s 忽略符号表和调试信息 -w 忽略DWARFv3...调试信息,将无法使用gdb进行调试 -extldflags "-static -fpic" 表示完全静态编译(默认静态链接 个别库可能会导致动态链接),这样编译生成文件就可以任意放到指定平台下运行...,不需要运行环境基础依赖库() 二进制压缩工具upx(可选) Mac下使用brew安装 $ brew install upx $ upx --version upx 3.96 其他平台: https

2K40

通过多阶段构建减小Golang镜像大小

让我们从一个通用Dockerfile开始,它负责处理基本事务,如依赖项、构建二进制文件、暴露必要端口等,以便为Go一个非常基础REST API提供服务。..."] 那将无缝地构建您项目的二进制文件,并创建Docker镜像。...我会说不,因为生成镜像大小超过300MB(确切地说是322MB),因为它包含了所有的Golang工具,这对我们来说是不必要,因为我们指示编译器禁用cgo(CGO_ENABLED=0)并静态链接任何将为我们提供自包含可执行文件...多阶段构建允许多个不同构建过程,这些构建可以完全从不同基础镜像构建,选择性地将文件从一个阶段传递到下一个阶段,从而剥离最终镜像中所有不必要文件。...例如,我们可以将前一个阶段称为BUILD,然后引入第二个阶段,我们称之为BINARIES,该阶段使用alpine:latest作为基础镜像,并从BUILD阶段复制我们构建应用程序二进制文件

9310

从Hexo迁移到Hugo-送漂亮Hugo Theme主题

Hugo安装和使用。 Hugo比Hexo速度更快,而且不用依赖一大堆东西,一个二进制文件就可以搞定。...Github下载 我们可以直接从Github Release页面下载对应二进制文件,然后把它放在你PATH目录里即可使用。这个支持任何平台,根据自己平台选择相应二进制包即可。...、项目管理、软件架构" keywords = "golang,go语言,go语言笔记,飞雪无情,java,android,博客,项目管理,python,软件架构,公众号,小程序" description...name表示显示链接文本,title表示鼠标悬停在友情链接时,显示文本。 Hugo maupassant 文章归档支持 Hugo默认是不支持生成归档文件,需要自己实现。...其他静态文件 有些不需要我们转化静态文件,比如robots.txt、我们上传附件等,这些不需要Hugo进行处理,可以直接放在static目录下,Hugo会原封不动拷贝。

2.1K10
领券