Golang + Linux + Docker 错误: standard_init_linux.go:211: 没有那个文件或目录。

4

这不是重复的问题,因为尽管错误相同,但我的用例与其他人不同。

我正在编译一个Go应用程序以便在 Docker 上部署:

  • 最新的 Arch Linux
  • 最新版 Docker,Golang:Alpine 镜像
  • 已尝试使用 Go 版本 1.13.3 和 1.14.4 Linux amd64
  • 没有 Bash 脚本或错误的文件结束符。整个项目都是在这台 Linux 机器上编写的
  • 我可以部署一个只有 fmt 打印但没有任何错误的空 Go 应用程序

然而,

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

  • OSX Mojave
  • 最新版 Docker
  • Go 1.13.3
  • GOOS=linux

错误:

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


分享 Dockerfile,docker-compose.yml - frozenOne
我们将尝试首先验证此文件是否存在于容器中,docker run -it <image_name> bash,检查指定位置上是否存在此文件,使用 ls -l 检查文件权限,它是否可执行?然后尝试在容器内调用此命令。 - frozenOne
我可以正常执行它,没有任何错误。已更新。 - keser
1
docker run -it <image_name> /bin/sh 怎么样? - frozenOne
让我们在聊天中继续这个讨论。链接:https://chat.stackoverflow.com/rooms/216863/discussion-between-frozenone-and-aomerk。 - frozenOne
1个回答

11

当启用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"' .

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接