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

我尝试使用从头开始构建一个小图像。我关闭了 CGO,但程序运行时仍然无法读取文件。我收到错误消息:“打开 ./app/a.txt:没有这样的文件或目录”。程序无法读取文件还有其他原因吗?


FROM golang:alpine AS builder


RUN apk update && apk add --no-cache git


WORKDIR $GOPATH/src/scratch

ADD . .


RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o /go/bin/scratch


FROM 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)

    }

}


慕勒3428872
浏览 87回答 2
2回答

绝地无双

alpine不提供glibc。alpine之所以这么小,是因为它使用了一个名为musl.libc.org的精简版 libstdc 。因此,我们将使用ldd命令检查静态链接的依赖项。$ docker run -it <image name> /bin/sh$ cd /go/bin$ ldd scratch&nbsp; &nbsp;# 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在构建时使用或添加&nbsp; RUN apk add --no-cache libc6-compat&nbsp;到您的Dockerfile或不使用golang:alpine

Cats萌萌

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

相关分类

Go