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

2024-01-16

我想构建一个 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/ https://blog.codeship.com/building-minimal-docker-containers-for-go-applications/

如果你宁愿坚持使用 alpine 那么你可以安装这个包来获取它们:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 Docker Alpine 镜像构建静态 Go 二进制文件? 的相关文章

  • 如何在 Ubuntu 16.04 LTS 中使用 IIS 运行 Docker 容器 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 在 Traefik 1.5.0-rc5 中使用新的 httpChallenge 时出现问题

    在尝试升级到最新的 traefik 版本以便能够从 LetsEncrypt 生成 TLS 证书时 我遇到了证书生成时间的问题 这之前工作过traefik 1 4使用acme ondemand标志和其他设置 减去httpChallenge当然
  • Docker pull:不允许操作

    我在拉取一些 docker 映像 但不是全部 时收到此错误 failed to register layer Error processing tar file exit status 1 operation not permitted 例
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • Windows下Kafka托管在Docker中删除主题时出现异常

    我在 Windows 的 Docker 中托管 Kafka 威斯迈斯特 卡夫卡 https hub docker com r wurstmeister kafka 使用 docker 镜像 Kafka 数据存储在本地 Windows 文件夹
  • 在 Windows 容器中使用命名管道(同一主机)

    我想要有 2 个 Windows 容器 在同一主机上运行 使用 Windows 10 客户端计算机和 Windows 的 docker 通过命名管道 不是匿名管道 进行通信 然而 我无法让它发挥作用 我的命名管道服务器类是在 GitHub
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 无法在 Vagrant 上运行的 CentOS 7 上安装 Docker

    使用 Vagrant 文件的全新实例 VAGRANTFILE API VERSION 2 Vagrant configure VAGRANTFILE API VERSION do config config vm box chef cent
  • 如何在C#中执行Go函数

    有没有办法从 C 执行 Go 函数 例如 对于 Python 我会使用 Ironpython 我知道我可以生成一个进程来执行 Go 脚本 但如果可能的话 我真的不想回退到这样的解决方案 Google 搜索没有显示任何内容 那么有什么方法可以
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 是否可以显示正在运行的 Docker 容器的重启策略?

    当我创建容器时 我指定了重新启动策略 但这没有显示在docker ps 并且似乎也没有任何格式字符串显示这一点 有谁知道如何查看正在运行的容器的重启策略 是的 可以使用docker inspect这是json格式 只需要查询即可 这是正在运
  • python:PyPi公共模块:如何确定是否安全?

    我已经完成了我的 python 3 应用程序 它正在使用 PyPi 的多个公共模块 然而 在我将其部署到我公司的企业 将处理客户的凭据并访问第 3 方 API 之前 我需要尽职调查确保它们既安全又安全 我必须执行哪些步骤 验证 PyPi 模
  • docker run -e 的环境变量

    这是我的 Dockerfile FROM ubuntu 16 04 RUN apt get update RUN apt get install y default jdk ADD sample docker 1 0 SNAPSHOT ja
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • 使用 OpenTelemetry 统一不同服务的范围

    我刚刚开始使用 OpenTelemetry 并为此创建了两个 微 服务 Standard and GeoMap 最终用户将请求发送到Standard服务 该服务又将请求发送到GeoMap在将结果返回给最终用户之前获取信息 我使用 gRPC
  • 无法从我的电脑上使用 traefik 后面的 gitlab 进行 git 克隆

    这是我的 gitlab 和 traefik 配置 version 3 7 services gitlab web image gitlab gitlab ce latest restart always hostname gitlab ro
  • 经常提交 docker 容器是一个好习惯吗?

    我在里面使用WebSphere Liberty 由于 WebSphere Liberty 需要频繁的 xml 编辑 这对于 Dockerfile 命令来说是不可能的 我必须不时地对容器进行 docker commit 以便其他人可以使用我的
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll

随机推荐