当前位置: 首页 > 面试题库 >

如何为Docker Alpine映像构建静态Go二进制文件?

井昊乾
2023-03-14
问题内容

我想构建一个Go 1.9.2二进制文件并在Docker
Alpine映像上运行它。我编写的Go代码不会调用任何C代码。它还使用该net包。不幸的是,它并没有听起来那么简单,因为Go似乎并非一直都在构建静态二进制文件。当我尝试执行二进制文件时,我经常会收到有关为什么二进制文件未执行的神秘消息。互联网上有很多与此有关的信息,但是大多数最终都导致人们使用试用错误来使二进制文件有效。

到目前为止,我已经找到了以下作品,但是我不知道为什么,它是最优的还是可以简化的。

env GOOS=linux GARCH=amd64 go install -v -a -tags netgo -installsuffix netgo -ldflags "-linkmode external -extldflags -static"

构造将在Alpine 3.7
docker映像上运行的Go二进制文件的规范方法(如果存在)是什么?我很乐意用来apk将软件包安装到Alpine映像中,如果这样做会使事情更高效/更容易。(相信我ca- certificates仍然需要安装。)


问题答案:

是的,您经常需要添加额外的资源文件(例如证书),尤其是在使用像alpine这样的最小发行版时,但是在这样小的发行版上可以运行go应用程序这一事实通常也被视为一个优势。

要添加证书,这是一个很好的说明,概述了如何在临时容器上进行操作:

https://blog.codeship.com/building-minimal-docker-containers-for-go-
applications/

如果您想坚持使用Alpine,则可以安装此软件包以获取它们:

https://pkgs.alpinelinux.org/package/v3.7/main/x86/ca-
certificates



 类似资料:
  • 问题内容: 我的问题如下: 我在机器上有二进制文件 从该二进制文件中,我需要编译一个外部.go文件 编译后,我需要将编译后的go文件链接到当前二进制文件中,以便可以使用刚刚编译的go代码。 您认为有可能吗? 我做了一些研究,似乎没有可能,但是我可能忽略了一些东西。 谢谢 :) 第一次进入二进制将包含类似 问题答案: 新:现在可以在主线Go中执行此操作,请参阅Go执行模式 从Go 1.5发行说明中

  • 问题内容: 在C语言中,我们可以构建二进制文件(目标文件和可执行文件)的调试版本或发行版本。我们如何在Go中做到这一点? 问题答案: 在Go中,通常没有调试版本或发行版本。 默认情况下,将符号和调试信息与二进制文件结合在一起。但是,您可以使用删除符号并调试信息。

  • 我正在尝试从转移到。在中,我有一个任务,将所有文件和文件夹从/statig/folder复制到/build/folder。如何对执行同样的操作?我需要一些插件吗?

  • 问题内容: 我已经使用以下命令从Docker文件构建了一个Docker映像。 当我尝试使用同一命令重建它时,它正在使用构建缓存,例如: 缓存显示已安装Aerospike。但是,我在从该图像生成的容器中找不到它,因此我想在不使用缓存的情况下重建该图像。如何强制Docker在没有缓存的情况下重建干净的映像? 问题答案: 有一个选项: 在较旧的Docker版本中,您需要通过,但情况不再如此。

  • 问题内容: 我对Go完全陌生,我试图读取一个二进制文件,一次读取一个字节或几个字节。该文档并没有多大帮助,我找不到任何教程或简单示例(顺便说一句,Google如何给他们的语言提供这样一个难以理解的名称?)。基本上,如何打开文件,然后将一些字节读入缓冲区?有什么建议吗? 问题答案: 要处理文件,该软件包是您的朋友: 在过去的文件是如何打开更多的控制,看到代替(DOC) 。 为了读取文件,有很多方法。

  • 问题内容: 这可能是一个非常业余的问题。我正在尝试将静态文件嵌入到二进制文件中。html。如何使用https://github.com/jteeuwen/go- bindata 做到这一点? 因此,我可以使用此https://github.com/jteeuwen/go-bindata#accessing-an- asset 访问资产,但是该如何处理“数据”,以及如何解析文件,执行模板以及服务他们