我希望这个非常简单的 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
但不包括 host
或 dig
,但通常这些都是需要输入的东西过程库调用会做得更好。否则你需要一个轻量级的基础 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/