提问人:Dmitry K 提问时间:3/5/2023 更新时间:3/5/2023 访问量:786
golang bazel docker 错误:无法启动进程:fork/exec /go/src/my_bin_svc:未实现函数
golang bazel docker error: could not launch process: fork/exec /go/src/my_bin_svc: function not implemented
问:
我正在尝试为使用 Bazel 构建的 GO 二进制文件设置 Delve (dlv) 调试器。
二进制文件将在 Docker 中运行。它自己运行良好。
但是当我尝试设置 Delve ( dlv ) 时,出现以下错误:
could not launch process: fork/exec /go/src/my_bin_svc: function not implemented
以下是系统和构建工具的说明:
主机系统:Mac OS M1
构建工具:Bazel,针对 linux-amd64 构建
运行时: Docker ( Docker version 20.10.17 )
这是我的 bazel 构建命令:
bazelisk build -c dbg --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 //...
这是我针对的特定服务的 BUILD 文件:
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
go_library(
name = "cmd_lib",
srcs = ["main.go"],
importpath = "github.com/xxxxxxxxxx/src/go-grpc-order-svc/cmd",
visibility = ["//visibility:private"],
deps = [
"//pkg/event",
"//pkg/schema",
"//proto/order",
"//src/go-grpc-order-svc/pkg/client",
"//src/go-grpc-order-svc/pkg/config",
"//src/go-grpc-order-svc/pkg/db",
"//src/go-grpc-order-svc/pkg/repository",
"//src/go-grpc-order-svc/pkg/service",
"@com_github_tinrab_retry//:retry",
"@org_golang_google_grpc//:go_default_library",
],
)
go_binary(
name = "cmd",
embed = [":cmd_lib"],
goarch = "amd64",
goos = "linux",
visibility = ["//visibility:public"],
)
这是我的Dockerfile:
FROM golang:1.18-bullseye
ENV GOOS="linux"
ENV APP_HOME /go/src
RUN mkdir -p "$APP_HOME"
WORKDIR "$APP_HOME"
EXPOSE 50053
EXPOSE 8080
EXPOSE 4000
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go install -gcflags="all=-N -l" -ldflags "-s -w -extldflags '-static'" github.com/go-delve/delve/cmd/dlv@latest
ENV GO111MODULE=off
ENTRYPOINT ["/go/bin/linux_amd64/dlv", "--listen=:4000", "--headless=true", "--api-version=2", "--log=true", "exec", "/go/src/my_bin_svc"]
这是 docker-compose 启动我的服务的部分:
my-bin-svc:
build:
dockerfile: src/go-grpc-order-svc/Dockerfile.debug
context: .
volumes:
#- ./bazel-bin/src/go-grpc-order-svc/cmd/cmd_/cmd:/go/src/order_svc
- ./bazel-out/darwin_arm64-dbg/bin/src/go-grpc-order-svc/cmd/cmd_/cmd:/go/src/my_bin_svc
ports:
- "50053:50053"
networks:
- backend
links:
- order-db
depends_on:
- order-db
现在在 bazel 中,我有几个包含二进制文件的文件夹:
如果我没记错的话,bazel-out/darwin_arm64-dbg <---包含带有调试符号的二进制文件(我需要与 delve 一起使用什么?这里的二进制文件可以自行运行良好(没有 delve ),但是在给 dlv 时会出现上述错误。
我也有
bazel-bin <---其中包含我的 Linux 二进制文件,这些二进制文件可以自行运行良好,但在提供给 DLV 时会出现上述错误。
我试图搜索那个特定的错误,但到目前为止还没有看到任何具体的东西。
有没有人看到这个错误并知道这是什么?
谢谢,非常感谢任何帮助。
我尝试在docker-compose中使用特定于平台的目标:
平台: Linux/AMD64
但到目前为止还没有成功。
答:
这是在 ARM 上的 amd64 容器中调试的已知问题,据我所知,唯一的解决方法是使用 QEMU 仿真或基于 linux/arm64 的映像。另请参阅此问题和有关 dlv 存储库的原始报告。第一个链接包含有关使其工作的更多详细信息
评论