docker - 在容器上调试 Go 进程不会监听映射的端口
问题描述
我在 MacOSX 上使用 Goland IDE,并且正在尝试调试在容器上运行的应用程序。我正在尝试远程调试,只是容器在我的本地。当我在我的 IDE 上运行调试器时,它确实会在断点处停止,但它正在调试的是我本地的应用程序,而不是容器上的应用程序。
作为背景,我的应用程序应该监听 8000 端口并返回“你好,访客!”。如果我通过 docker 容器编译并运行此文件,映射我的端口 8000 并通过浏览器或通过 .http 文件发出请求,我确实会收到此响应。但是,当我通过容器上的 Delve 运行它时,它不会通过浏览器响应。
此外,一旦容器启动,当我在 IDE 上启动调试器时,它不会调试容器上的应用程序,因为它抱怨
2020/08/05 17:57:39 main.go:16: listen tcp :8000: bind: address already in use
我试过按照这 2 个教程进行操作,除了他们使用的 docker 镜像的版本之外,它们大部分都是相同的。
我也浏览了这两个帖子的所有评论,但没有找到任何可以解决我问题的东西。
这是我的 main.go
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
// Set the flags for the logging package to give us the filename in the logs
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("starting server...")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintln(w, `Hello, visitor!`)
})
log.Fatal(http.ListenAndServe(":8000", nil))
}
这是我的 Dockerfile:
# Compile stage
FROM golang AS build-env
# Build Delve
RUN git config --global http.sslVerify "false"
RUN git config --global http.proxy http://mycompanysproxy.com:80
RUN go get github.com/go-delve/delve/cmd/dlv
ADD . /dockerdev
WORKDIR /dockerdev
RUN go build -gcflags="all=-N -l" -o /server
# Final stage
FROM debian:buster
EXPOSE 8000 40000
WORKDIR /
COPY --from=build-env /go/bin/dlv /
COPY --from=build-env /server /
CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/server"]
容器成功启动,附加控制台的日志显示:
API server listening at: [::]:40000
但是,它似乎没有在听。如果我跑
GET http://localhost:8000/
Accept: application/json
我希望它在断点处停止,但事实并非如此。相反,它抱怨:
org.apache.http.NoHttpResponseException: localhost:8000 failed to respond
我错过了什么吗?这是在容器化应用程序上调用调试器的方式吗?
解决方案
推荐阅读
- reactjs - React - 防止 HOC 基于 props 重新计算
- python-3.x - 如何使用 fontTools 检测 Type 1 和 OpenType CFF 字体
- .net - 如何使用动态文件路径响应 Wiremock.Net?
- javascript - 如何从 FB 页面获得响应,如 Angular 5
- android - 处理和显示工具栏上的后退图标,片段 onbackpressed
- apache-royale - Jewel textinput 在运行时禁用或只读
- excel - 为什么我的 Do While 循环在运行时不能正确复制所有内容?
- angular - 引导工具提示不适用于 *ngIf
- go - 将切片调整为新顺序
- sql - 如何在不使用连接的情况下在 array_agg 中使用子查询