Отладка процесса Go в контейнере не прослушивает сопоставленный порт

Я использую Goland IDE на MacOSX и пытаюсь отладить приложение, работающее в контейнере. Я пытаюсь выполнить удаленную отладку, просто контейнер находится на моем локальном компьютере. Когда я запускаю отладчик в своей IDE, он останавливается в точке останова, но отлаживает приложение на моем локальном, а не приложение на контейнер.

Для фона мое приложение должно прослушивать порт 8000 и возвращать «Привет, посетитель!». Если я скомпилирую и запущу этот файл через контейнер докеров, сопоставлю свой порт 8000 и сделаю запрос через браузер или через файл .http, я получу этот ответ. Однако, когда я запускаю его через Delve в контейнере, он не отвечает через браузер.

Кроме того, когда контейнер запущен, когда я запускаю отладчик в своей IDE, он не отлаживает приложение в контейнере, поскольку он жалуется на

2020/08/05 17:57:39 main.go:16: listen tcp :8000: bind: address already in use

Я пытался следовать этим двум учебникам, оба из которых в основном одинаковы, за исключением версии их изображений докеров, которые они используют.

Учебник1 Учебник2

Я также просмотрел все комментарии к этим двум сообщениям, но не нашел ничего, что могло бы решить мою проблему.

Вот мой 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

Я что-то упускаю? Это способ вызвать отладчик в контейнерном приложении?

Дополнительная информация: конфигурация

конфигурация2

структура каталогов


person jkasper    schedule 06.08.2020    source источник
comment
ваш отладчик работает на вашем локальном компьютере (ваш компьютер/locahost). Контейнер/докер-контейнер запускает либо скомпилированный двоичный файл вашего приложения, либо запускает ваш файл go (в зависимости от ваших команд docker build и docker run). В любом случае вы должны сначала отлаживать свое приложение локально, а затем запускать его в своем контейнере.   -  person whitespace    schedule 06.08.2020
comment
Он запускает скомпилированный двоичный файл моего приложения. То есть вы хотите сказать, что я сначала запускаю отладчик в IDE на main.go, как только он останавливается в точке останова, я запускаю Dockerfile? Не будет ли он жаловаться на тот же порт, который уже используется локальным приложением, когда оно пытается связать порт?   -  person jkasper    schedule 06.08.2020
comment
если вы попытаетесь запустить и отладчик, и приложение, оно будет жаловаться, если вы хотите сначала отладить приложение, а затем приложение может запуститься (либо на локальном хосте, либо на докере). Если вы хотите запустить приложение во время отладки исходного файла, вам нужно будет переназначить порт на другое значение (:8080 или что-то в этом роде). Да, если вы попытаетесь привязать отладчик и приложение к одному и тому же порту, оно будет жаловаться.   -  person whitespace    schedule 06.08.2020


Ответы (1)


Я понял, что использовал неправильную конфигурацию отладки. Необходимо нажать кнопку отладки с удаленной отладкой (вверху справа), отображаемой в конфигурации. введите здесь описание изображения

person jkasper    schedule 07.08.2020