我在为Golang API构建Docker时遇到问题

时间:2020-01-14 22:00:48

标签: docker go dockerfile

我是Docker的新手。

我正在尝试使用echo服务器来实现RESTfull api。当我运行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

卷曲:(56)接收失败:对等重置连接

我该如何解决此问题?

1 个答案:

答案 0 :(得分:2)

您需要在容器的外部端口上运行应用程序。

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

之所以会这样,是因为EXPOSE 8080命令将应用程序端口转发到容器的外部端口上打开的应用程序端口(而不是内部端口,例如localhost)。

此后,命令docker run -d -p 8080:8080 my-docker(更确切地说是参数-p)将外部端口从容器转发到计算机上的外部端口。