我当前的开发设置是一个 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)
如果您在 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)
归档时间: |
|
查看次数: |
1237 次 |
最近记录: |