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

提问人:Dmitry K 提问时间:3/5/2023 更新时间:3/5/2023 访问量:786

问:

我正在尝试为使用 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

但到目前为止还没有成功。

Docker Go bazel delve dlv

评论


答:

2赞 Zac Anger 3/5/2023 #1

这是在 ARM 上的 amd64 容器中调试的已知问题,据我所知,唯一的解决方法是使用 QEMU 仿真或基于 linux/arm64 的映像。另请参阅此问题有关 dlv 存储库的原始报告。第一个链接包含有关使其工作的更多详细信息

评论

0赞 Dmitry K 3/15/2023
谢谢,使用基于 linux/arm64 似乎已经解决了我的问题。