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 шт):
Инструкция EXPOSE 8080 декларативная. Она не заставляет докер при запуске контейнера пробрасывать порты. Вам нужно при запуске явно указать в командной строке отображение хостового порта на порт приложения:
docker run -p 8080:8080 ...
UPDATE
У вас в контейнере сервер запускается на интерфейсе localhost:
Addr: "127.0.0.1:" + port,
Докер не умеет пробрасывать порты, открытые в контейнере на интерфейсе loopback. Вам нужно заменить адрес
Addr: ":" + port,
В результате порт будет слушать все сетевые интерфейсы внутри контейнера, и поэтому докер сможет пробросить этот порт во вне.