为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
喵喵时光机 2023-06-01 17:22:17
我试图让一个在 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/amd64Docker version 18.09.1, build 4c52b90ubuntu 18.04LTS我将不胜感激任何建议。由 vishnu narayanan 解决:我用了`CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo test.go`构建一个静态可执行文件,它成功了。
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

为什么 ?

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

由于scratch是空的,二进制文件无法找到系统库并抛出错误。

如何解决这个问题?

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

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

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


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信