登录
首页 >  Golang >  Go问答

在临时Dockerfile中将Go二进制文件/usr/bin/host添加到主机?

来源:stackoverflow

时间:2024-03-09 19:12:24 301浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《在临时Dockerfile中将Go二进制文件/usr/bin/host添加到主机?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我希望这个非常简单的 go 包能够使用 scratch(或最小)映像在 docker 容器中运行。

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := "host"
    args := []string{"-t", "ns", "google.com"}
    output, err := exec.command(cmd, args...).output()
    if err != nil {
        fmt.println(err)
    }
    fmt.println(string(output))
}

我原来的dockerfile如下:

FROM scratch
ADD gohost /
CMD ["/gohost"]

这会导致 exit 代码 0: exec: "host": $path 中找不到可执行文件

我认为这意味着我需要 add /usr/bin/host 并在添加的主机上设置 env ..但是我尝试过的所有随机组合都失败了..

我还尝试简单地将 cmd := "host" 更改为指向我添加的主机二进制文件 (cmd := "/host"),但似乎这也不可能。

另外,我不确定它是否相关,但重要的是 go 二进制文件是使用 env goos=linux goarch=arm64 go build 构建的。


解决方案


如果您依赖于调用外部二进制文件,那么您还需要确保它们是静态编译的并包含在您的 dockerfile 中,或者您不能使用 from scrap 映像。一个非常小的基础镜像可能效果更好。

在许多情况下,有一个 go-native 库可以满足您的需要,您可能会看到是否可以更改代码以不需要外部进程。例如,您可以调用 net.LookupHost,而不是调用 host 作为外部进程。

busybox (image) 中提供了一些常用工具,包括 nslookup,但不包括 hostdig,但通常这些是进程内库调用会做得更好的事情。否则,您需要一个轻量级的基础 linux 发行版,例如 alpine,您可以使用 add software;你的 dockerfile 是

FROM alpine
RUN apk add bind-tools
COPY gohost /bin
CMD ["gohost"]

alpine 基础镜像宣称自己只有 5 mb,因此您的镜像将比 from scrap 镜像大,但仍然不算大。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>