在 golang 中导入存档/tar 时 docker run 失败

我试图让一个在 cmd 行上运行的 golang 程序在 docker 容器中运行,但是导入 archive/tar 会导致错误。


这有效:



    package main

    import (

            "fmt"

    )

    func main() {

            fmt.Println("success!")

    }

产生输出:


    liam gotest $ docker run -it gotest

    success!

这不会:



    package main

    import (

            "archive/tar"

            "fmt"

    )

    var _ = tar.TypeReg

    func main() {

            fmt.Println("success!")

    }

产生输出:



    liam gotest $ docker run -it gotest

    standard_init_linux.go:207: exec user process caused "no such file or directory"

这是我的 Dockerfile:



    FROM scratch

    WORKDIR /app

    COPY . /app

    CMD ["./test"]

我在跑:


go version go1.11.4 linux/amd64

Docker version 18.09.1, build 4c52b90

ubuntu 18.04LTS

我将不胜感激任何建议。


由 vishnu narayanan 解决:


我用了


`CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo test.go`

构建一个静态可执行文件,它成功了。


喵喵时光机
浏览 151回答 1
1回答

墨色风雨

为什么 ?这是因为默认go build行为。由于动态链接,编译后的二进制文件仍在系统路径中寻找库。由于scratch是空的,二进制文件无法找到系统库并抛出错误。如何解决这个问题?修改构建脚本以生成包含所有内置库的静态编译构建。CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .将上述构建的输出二进制文件用于 docker 容器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go