【问题标题】:docker run fails when importing archive/tar in golang在 golang 中导入存档/tar 时 docker run 失败
【发布时间】:2019-06-14 10:38:53
【问题描述】:

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

这行得通:


    package main
    import (
            "fmt"
    )
    func main() {
            fmt.Println("success!")
    }

产生输出:

liam gotest $ docker run -it gotest 成功!

这不是:


    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 版本 go1.11.4 linux/amd64
Docker 版本 18.09.1,构建 4c52b90
ubuntu 18.04LTS

如果有任何建议,我将不胜感激。

由毗湿奴纳拉亚南解决:

我用过

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

构建一个静态可执行文件,它工作。

【问题讨论】:

    标签: docker go


    【解决方案1】:

    为什么?

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

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

    如何解决这个问题?

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 2020-08-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2020-09-14
      • 2017-03-30
      • 1970-01-01
      相关资源
      最近更新 更多