登录
首页 >  Golang >  Go问答

开始制作小型图像(错误:找不到指定的文件或目录)

来源:stackoverflow

时间:2024-02-21 16:45:28 415浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《开始制作小型图像(错误:找不到指定的文件或目录)》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我尝试使用scratch来构建一个小图像。我关闭了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)
    }
}

解决方案


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

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

$ docker run -it  /bin/sh
$ cd /go/bin
$ ldd scratch   # or the excutable you are calling-> ldd 

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

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

run apk add --no-cache libc6-compat 添加到您的 dockerfile,以在一些基于 golang alpine 映像的 dockerfile 中添加 libstdc

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

  • 禁用 cgo:构建时使用 cgo_enabled=0
  • 或添加 运行 apk 添加 --no-cache libc6-compat 到你的 dockerfile
  • 或者不使用 golang:alpine

以上就是《开始制作小型图像(错误:找不到指定的文件或目录)》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>