我希望这个非常简单的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二进制文件很重要。
答案 0 :(得分:1)
如果您依赖于调用外部二进制文件,则还需要确保它们是静态编译的并包含在Dockerfile中,或者您不能使用FROM scratch
映像。仅很小的基本映像可能会更好。
在许多情况下,有一个Go-native库可以满足您的需要,您可能会发现是否可以更改代码以不需要外部进程。例如,您可以调用net.LookupHost
来代替外部调用host
。
busybox(image)中提供了一些常用工具,包括nslookup
但不包括host
或dig
,但通常是进程内库调用会做得更好。否则,您需要像alpine这样的轻量级基本Linux发行版,在这里您可以add software;您的Dockerfile将是
FROM alpine
RUN apk add bind-tools
COPY gohost /bin
CMD ["gohost"]
Alpine基本映像仅宣传5 MB,因此您的映像将比FROM scratch
映像大,但仍然不大。