通过热重载深入调试

The*_*ter 7 go docker delve

我当前的开发设置是一个 docker 文件,它在每次保存时使用CompileDaemon编译代码,并使用Delve进行调试。

目前我几乎可以完成所有工作。唯一的问题是,当我尝试再次启动调试时,该端口已在使用中。

他们是在 docker 容器内通过调试完成实时重新加载的更好方法吗?

Dockerfile:

FROM golang:latest

RUN go get github.com/githubnemo/CompileDaemon && \
  go get github.com/go-delve/delve/cmd/dlv  
WORKDIR /app
COPY go.* ./
RUN go mod download

COPY ./ ./

EXPOSE 5000 2345
# echo 1 is to block build command 
ENTRYPOINT CompileDaemon --build="echo 1" --command="dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient cmd/app/main.go"
Run Code Online (Sandbox Code Playgroud)

ana*_*nth 0

如果您在 CompileDaemon 中使用 Gracefulkill 和命令 stop ,则此方法有效,因为我希望杀死使用 dlv 旋转的应用程序的子进程,并且在内部,CompileDaemon 使用 os.process.Kill() ,它不会杀死整个进程树,只是 dlv 一个。如果仅杀死 dlv,go 进程仍将运行,因此新的 dlv 无法在同一端口上启动同一进程,这会导致类似 的错误[GIN-debug] [ERROR] listen tcp :5100: bind: address already in use

为了确保 go 进程被终止,对我有用的完整命令是:

ENTRYPOINT CompileDaemon -log-prefix=false -command-stop=true -graceful-kill=true -build="go build -o __debug_service ./" -command="dlv debug --listen=:2001 --continue --headless=true --api-version=2 --accept-multiclient"
Run Code Online (Sandbox Code Playgroud)