主机要添加/ usr / bin / host来擦除由Go二进制组成的Dockerfile?

时间:2018-10-04 10:41:21

标签: 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。但是我尝试过的所有随机组合都失败了。 / p>

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

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

1 个答案:

答案 0 :(得分:1)

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

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

busyboximage)中提供了一些常用工具,包括nslookup但不包括hostdig,但通常是进程内库调用会做得更好。否则,您需要像alpine这样的轻量级基本Linux发行版,在这里您可以add software;您的Dockerfile将是

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

Alpine基本映像仅宣传5 MB,因此您的映像将比FROM scratch映像大,但仍然不大。