docker - host to add/usr/bin/host to scratch 由 Go binary 组成的 Dockerfile?

标签 docker go dockerfile

我希望这个非常简单的 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 code 0: exec: "host": executable file not found in $PATH

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

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

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

最佳答案

如果您依赖于调用外部二进制文件,您还需要确保它们是静态编译的并包含在您的 Dockerfile 中,或者您不能使用 FROM scratch 图像。一个非常小的基础图像可能会更好。

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

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 scratch 图像大,但仍然不大。

关于docker - host to add/usr/bin/host to scratch 由 Go binary 组成的 Dockerfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52644718/

相关文章:

docker - 无法在Docker中链接Consul和Spring Boot应用

docker - 将图像从kitematic导入到boot2docker

Docker Compose 使用缓存构建命令,并且在复制到 docker 时不拾取更改的文件

docker - 去构建 : build output "api" already exists and is a directory

docker - 使用 docker swarm 执行单个容器而不是 "services"

node.js - 将字体添加到 Puppeteer PDF 渲染器

docker - 在Windows上通过Docker Toolbox运行Hello world时出错: “docker daemon is not running”

go - 如何从 map 中删除多个项目

sqlite - Golang/ Gin : How to Pass db to router functions

go - 如果异常断开,Websocket 会卡住