【问题标题】:Golang + Linux + Docker error : standard_init_linux.go:211 : no such file or directoryGolang + Linux + Docker 错误:standard_init_linux.go:211:没有这样的文件或目录
【发布时间】:2020-10-19 06:35:42
【问题描述】:

这不是重复的,因为虽然错误相同,但我的用例与其他用例不同。

我正在编译一个 go 应用程序以使用 docker on 进行部署:

  • 最新的arch linux
  • 最新的 docker 版本,golang:alpine 镜像
  • 尝试使用 go 版本 1.13.3 和 1.14.4 linux amd64
  • 我没有 bash 脚本或错误的文件结尾。整个项目都是在这台 Linux 机器上编写的
  • 我可以部署一个只有 fmt 打印且没有任何错误的空 go 应用程序

然而,

当我在我的 OSX 机器上构建它并将其发送到 linux 时,我可以将该可执行文件部署到 docker 而不会出现任何错误

  • OSX 莫哈韦
  • 最新的码头工人
  • 转到 1.13.3
  • GOOS=linux

错误:

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

【问题讨论】:

  • 共享 Dockerfile,docker-compose.yml
  • 我们会先验证这个文件是否存在于容器内,docker run -it <image_name> bash,检查这个文件是否存在于指定位置,用ls -l检查它的文件权限,是不是可执行?然后尝试在容器内调用此命令。
  • 我可以正常执行没有任何错误,已更新
  • docker run -it <image_name> /bin/sh 怎么样?

标签: linux docker go


【解决方案1】:

当您使用启用cgo 编译您的go 应用程序时,编译器会动态链接到libstdc

不过,golang:alpine 的图像太小了,因为它没有使用libstdc,而是使用了一个简化版本,称为musl libc

错误信息说

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

如果您使用

连接到您的图像
$ docker run -it [image] /bin/sh

您可以在假设为/dist/myexec 中找到您的可执行文件,但是当您尝试运行该可执行文件时,它显示为err not found,因为它显然找不到您的可执行文件,但它找不到文件libc

解决办法是

  • 禁用 CGO:在构建时使用 CGO_ENABLED=0

  • 或添加

    RUN apk add --no-cache libc6-compat
    

    致您的Dockerfile

  • 或者不要使用golang:alpine

要拥有一个全静态二进制可执行文件,请使用以下命令构建它:

$ CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' .

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多