У меня проблемы с построением docker для golang API - PullRequest
0 голосов
/ 15 января 2020

Я новичок в docker.

Я пытаюсь реализовать RESTfull api в go с использованием эхо-сервера. Мой код работает нормально, когда я запускаю main.go, но я не могу запустить его, используя docker.

, это мой эхо-сервер:

r := router.Router()
r.Logger.Fatal(r.Start("localhost:8080"))

, а это мой Dockerfile:

FROM golang:latest AS build

ENV GO111MODULE=on \
    CGO_ENABLED=1

#Maintainer info
LABEL maintainer="Saman Hoseini"

WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN go build -o main .

#this step is for CGO libraries
RUN ldd main | tr -s '[:blank:]' '\n' | grep '^/' | \
    xargs -I % sh -c 'mkdir -p $(dirname ./%); cp % ./%;'
RUN mkdir -p lib64 && cp /lib64/ld-linux-x86-64.so.2 lib64/

#Second stage of build
FROM alpine:latest
RUN apk update && apk --no-cache add ca-certificates \
    sqlite

COPY --from=build /app ./

EXPOSE 8080

ENTRYPOINT ["./main"]

После сборки при запуске контейнера я сталкиваюсь с ошибкой скручивания:

$ docker run -d -p 8080: 8080 my- docker

$ curl http://localhost: 8080

curl: (56) Ошибка Recv: сброс соединения по пиру

как я могу решить эту проблему?

1 Ответ

2 голосов
/ 15 января 2020

Вам необходимо запустить приложение на внешнем порту вашего контейнера.

r := router.Router()
r.Logger.Fatal(r.Start(":8080"))

Это происходит потому, что команда EXPOSE 8080 перенаправляет открытый порт приложения на внешний порт контейнера (не внутренний, как localhost).

После этого команда docker run -d -p 8080:8080 my-docker, точнее параметр -p, перенаправляет внешний порт из вашего контейнера во внешний порт на вашей машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...