
php小编苹果在使用Docker时可能会遇到一个常见的错误: "Docker 镜像执行 golang 可执行文件:exec /usr/local/go/bin/go: exec 格式错误"。这个错误通常是由于镜像中的golang可执行文件没有正确执行所导致的。解决这个问题的方法有很多,包括检查golang可执行文件的权限、查看可执行文件是否可访问、检查执行文件的路径是否正确等。通过解决这个问题,可以确保在Docker中正确执行golang可执行文件,提高代码开发的效率和稳定性。
我知道如果 go 可执行文件要在另一台计算机上运行,我需要指定它的目标平台。我正在使用 m1 芯片在苹果机器上构建 docker 映像:
dockerfile
from --platform=linux/amd64 golang:alpine as build workdir / add go.mod . add go.sum . run go mod download copy . . run cgo_enabled=0 goos=linux goarch=amd64 go build -ldflags="-s -w" -o . from --platform=linux/amd64 scratch workdir /app copy --from=build /foo /foo cmd ["./foo"]
这似乎有效,因为在构建输出后检查容器
立即学习“go语言免费学习笔记(深入)”;
"architecture": "amd64", "os": "linux"
但是当我现在使用 docker-compose 在 linux 服务器上启动映像时,出现错误: exec /usr/local/go/bin/go: exec format error
docker-compose.yml
foo:
environment:
- PORT=${PORT}
image: docker.io/name/foo
platform: linux/amd64
ports:
- "8000:8000"
restart: always我对 docker 还很陌生,所以我想我在这里遗漏了一些非常明显的东西。
首先,我可以确认您已成功构建 amd64 二进制文件,因此这不是 go 问题。
如果我运行您的映像(在 amd64 linux 系统上),我不会收到您报告的相同错误。鉴于此 docker-compose.yaml:
foo:
environment:
- port=${port}
image: docker.io/chedched/foo
platform: linux/amd64
ports:
- "8000:8000"
restart: always运行 docker-compose up 时,我看到:
error: for images_foo_1 cannot start service foo: failed to create shim task: oci runtime create failed: runc create failed: unable to start container process: exec: "./foo": stat ./foo: no such file or directory: unknown
发生这种情况是因为您设置了 workdir /app,这使得 app 成为映像中的当前工作目录,但您已将二进制文件安装为 /foo。您需要:
更改您的 cmd 以引用正确的位置:
cmd ["/foo"]
或者...
在 /app 中安装二进制文件:
COPY --from=build /foo ./foo
通过这些更改中的任何一个,图像都会按预期运行。
以上就是Docker 镜像执行 golang 可执行文件:exec /usr/local/go/bin/go: exec 格式错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号