Я использую Goland IDE на MacOSX и пытаюсь отладить приложение, работающее в контейнере. Я пытаюсь выполнить удаленную отладку, просто контейнер находится на моем локальном компьютере. Когда я запускаю отладчик в своей среде IDE, он останавливается на точке останова, но то, что он отлаживает, - это приложение на моем local и , а не в контейнере .
В качестве фона мое приложение должно прослушивать порт 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 изображений, которые они используют.
Tutorial1 Tutorial2
Я просмотрел все комментарии к этим 2 сообщениям, но не нашел ничего, что могло бы решить мою проблему.
Вот мой основной. 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
Я что-то упускаю? Это способ вызвать отладчик в контейнерном приложении?
Дополнительная информация: ![configuration](https://i.stack.imgur.com/UaVQV.png)
![configuration2](https://i.stack.imgur.com/wp1tw.png)
структура каталогов