linux - Golang + Linux + Docker 错误:standard_init_linux.go:211:没有这样的文件或目录
问题描述
这不是重复的,因为尽管错误相同,但我的用例与其他用例不同。
我正在编译一个 go 应用程序以在 docker 上部署:
- 最新的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"
解决方案
当你编译你的 go 应用时cgo
,编译器会动态链接到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"' .
推荐阅读
- ios - Firestore - 获取文档的子对象而不是 FIRDocumentReference
- spring - 如何配置 Spring Cloud StreamBridge 来生产 Avro?
- caching - 浏览器不缓存 AJAX GET 请求
- raspberry-pi - 如何用我的手机 (android) 控制乐高技术红外接收器?
- javascript - 单击按钮时在for循环中从数组中获取值
- r - 在 ggplot 中使用 percent(accuracy = 3L) 时,百分比不会四舍五入
- javascript - D3.js 中的 if else 语句用于自定义色标
- input - XY 图形的用户输入范围
- r - 调整以使条件面板仅在加载正确的文件时出现
- python - 如何按列值年份和月份分组以获得上个月的工资?