为了账号安全,请及时绑定邮箱和手机立即绑定

从头开始构建小图像(打开:没有这样的文件或目录)

从头开始构建小图像(打开:没有这样的文件或目录)

Go
慕勒3428872 2022-06-13 15:59:45
我尝试使用从头开始构建一个小图像。我关闭了 CGO,但程序运行时仍然无法读取文件。我收到错误消息:“打开 ./app/a.txt:没有这样的文件或目录”。程序无法读取文件还有其他原因吗?FROM golang:alpine AS builderRUN apk update && apk add --no-cache gitWORKDIR $GOPATH/src/scratchADD . .RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o /go/bin/scratchFROM scratch# Copy static executable.COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/COPY --from=builder /go/bin/scratch /go/bin/scratch# Run the binary.ENTRYPOINT ["/go/bin/scratch"]func main() {    resp, err := http.Get("https://google.com")    check(err)    body, err := ioutil.ReadAll(resp.Body)    check(err)    fmt.Println(len(body))    LocalFile := "./app/a.txt"    fmt.Println(LocalFile)    dat, err := ioutil.ReadFile(LocalFile)    check(err)    fmt.Print(string(dat))    f, err := os.Open(LocalFile)    check(err)    b1 := make([]byte, 5)    n1, err := f.Read(b1)    check(err)    fmt.Printf("%d bytes: %s\n", n1, string(b1[:n1]))}func check(err error) {    if err != nil {        fmt.Println(err)        os.Exit(1)    }}
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

alpine不提供glibc。alpine之所以这么小,是因为它使用了一个名为musl.libc.org的精简版 libstdc 。


因此,我们将使用ldd命令检查静态链接的依赖项。


$ docker run -it <image name> /bin/sh

$ cd /go/bin

$ ldd scratch   # or the excutable you are calling-> ldd <executable>

检查链接的静态文件,它们是否存在于该版本的 alpine 上?如果不从二进制文件的角度来看,它没有找到文件——并且会报告File not found.

以下步骤取决于缺少哪些二进制文件,您可以在互联网上查找如何安装它们。

添加RUN apk add --no-cache libc6-compat到您的 Dockerfile 以添加libstdc一些Golang基于 alpine 图像的 Dockerfile。

在您的情况下,解决方案是

  • 禁用 CGO:CGO_ENABLED=0在构建时使用

  • 或添加  RUN apk add --no-cache libc6-compat 到您的Dockerfile

  • 或不使用golang:alpine


查看完整回答
反对 回复 2022-06-13
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我错误地用程序要读取的 txt 文件编译 go 程序。这就是为什么程序编译为二进制 exec 后文件路径不正确的原因。以防万一有人像我一样犯了同样的错误,这是我的解决方案之一。我通过将文本文件移出我的项目并使用 env 变量指向我想要的路径来解决问题。

查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信