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

时间:2019-01-21 03:35:19

标签: docker go

我正在尝试在cmd行上运行的golang程序在docker容器中运行,但是导入存档/ 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

我将不胜感激。

由毗湿奴·纳拉亚南解决:

我用过

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

构建一个静态可执行文件,并且可以正常工作。

1 个答案:

答案 0 :(得分:2)

为什么?

这是由于默认的go build行为。由于动态链接,编译后的二进制文件仍在系统路径中寻找库。

由于scratch为空,因此二进制文件无法找到系统库并引发错误。

如何解决此问题?

修改构建脚本以生成包含所有内置库的静态编译构建。

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

将上述构建的输出二进制文件用于docker容器。