err_empty_response docker

Пишу веб-сервис на Golang. Хочу использовать Docker, но не получается.
app.go - главный файл

package main

import (
    scraper_app "github.com/fentezi/scraper"
    "github.com/fentezi/scraper/internal/handler"
    "github.com/fentezi/scraper/pkg/logging"
)

func main() {
    logger := logging.GetLogger()
    logger.Info("Start server")
    srv := new(scraper_app.Server)
    logger.Info("Init handler")
    hand := handler.NewHandler(logger)
    if err := srv.Run("8080", hand.InitRouters()); err != nil {
        logger.Fatal(err)
    }
}

server.go - инициализация сервера

package scraper_app

import (
    "net/http"
    "time"
)

type Server struct {
    httpServer *http.Server
}

func (s *Server) Run(port string, handler http.Handler) error {
    s.httpServer = &http.Server{
        Addr:         "127.0.0.1:" + port,
        Handler:      handler,
        ReadTimeout:  10 * time.Second,
        WriteTimeout: 10 * time.Second,
    }
    return s.httpServer.ListenAndServe()
}

Dockerfile

FROM golang:latest

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download

COPY . .

EXPOSE 8080

CMD ["go", "run", "./cmd/app.go"]

Контейнер создался без ошибок, всё нормально. Когда в браузере ввожу "http://localhost:8080", то получаю ошибку.

Страница недоступна. Сайт localhost не отправил данных. ERR_EMPTY_RESPONSE

Как это решить?


Ответы (1 шт):

Автор решения: Pak Uula

Инструкция EXPOSE 8080 декларативная. Она не заставляет докер при запуске контейнера пробрасывать порты. Вам нужно при запуске явно указать в командной строке отображение хостового порта на порт приложения:

docker run -p 8080:8080 ...

UPDATE

У вас в контейнере сервер запускается на интерфейсе localhost:

Addr:         "127.0.0.1:" + port,

Докер не умеет пробрасывать порты, открытые в контейнере на интерфейсе loopback. Вам нужно заменить адрес

Addr:         ":" + port,

В результате порт будет слушать все сетевые интерфейсы внутри контейнера, и поэтому докер сможет пробросить этот порт во вне.

→ Ссылка