为了账号安全,请及时绑定邮箱和手机立即绑定

无法让 Docker 容器在显示“连接重置”的本地主机上运行?

无法让 Docker 容器在显示“连接重置”的本地主机上运行?

Go
回首忆惘然 2022-04-26 14:45:33
无法让 Docker 容器在 localhost 上运行,它在访问 localhost:8080 时显示“连接重置”。以下是我所知道的,请耐心等待:代码在我运行时在本地运行,我可以看到http://localhost:8080页面Docker 构建命令完成且没有错误卷曲服务器时出错:curl -X GET http://localhost:8080curl: (52) 来自服务器的空回复docker run -d -p 8080:8080 --name goserver -it goserverDockerfile: FROM golang:1.9.2 ENV SRC_DIR=/go/src/ ENV GOBIN=/go/bin WORKDIR $GOBIN # Add the source code: ADD . $SRC_DIR RUN cd /go/src/; RUN go get github.com/gorilla/mux; CMD ["go","run","main.go"] #ENTRYPOINT ["./main"] EXPOSE 8080这是go代码:package mainimport (    "fmt"    "net/http"    "github.com/gorilla/mux")func main() {    r := mux.NewRouter()    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {        fmt.Fprintf(w, "<h1>This is the homepage. Try /hello and /hello/Sammy\n</h1>")    })    r.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {        fmt.Fprintf(w, "<h1>Hello from Docker!\n</h1>")    })    r.HandleFunc("/hello/{name}", func(w http.ResponseWriter, r *http.Request) {        vars := mux.Vars(r)        title := vars["name"]        fmt.Fprintf(w, "<h1>Hello, %s!\n</h1>", title)    })    http.ListenAndServe(":8080", r)}
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您正在以分离 ( -d) 模式启动图像 - 这就是您看不到错误消息的原因。的问题很少Dockerfile,应该使用@andre 答案修复,但很可能您忘记重建图像并且没有看到效果。


我提交此答案是为了建议您对以下内容进行一些改进Dockerfile:


# first stage - builds the binary from sources

FROM golang:1.12.14-alpine3.10 as build


# using build as current directory

WORKDIR /build


# Add the source code:

COPY main.go ./


# install build deps

RUN apk --update --no-cache add git


# downloading dependencies and

# building server binary

RUN go get github.com/gorilla/mux && \

  go build -o server .


# second stage - using minimal image to run the server

FROM alpine:3.10


# using /app as current directory

WORKDIR /app


# copy server binary from `build` layer

COPY --from=build /build/server server


# binary to run

CMD "/app/server"


EXPOSE 8080

我将您Dockerfile分为两个阶段:构建和运行。Build 阶段负责构建服务器二进制文件,run 阶段负责运行它。请参阅https://docs.docker.com/develop/develop-images/multistage-build/

然后我将多个RUNs 合并为一个:go get github.com/gorilla/mux && go build -o server .以避免创建冗余层。

我修复WORKDIR了 s 并赋予它们可读的语义名称。


不要忘记重建它docker build . -t goserver并运行它


docker run -p 8080:8080 --name goserver goserver

如果一切正常,并且您已准备好(并且需要)以分离模式启动,则添加-d标志。


此外,您可能需要检查Dockerfile 最佳实践。


查看完整回答
反对 回复 2022-04-26
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

你WORKDIR是错的,基于你如何设置你的CMD


改变你的WORKDIR,SRC_DIR而不是,GOBIN它会工作


你也可以go install main.go在你的 Dockerfile 上运行


go install将创建可执行文件并将其移动到 bin 文件夹


这是一个工作 Dockerfile 的示例:


FROM golang:1


ENV SRC_DIR=/go/src/

ENV GOBIN=/go/bin


WORKDIR $SRC_DIR


# Add the source code:

ADD . $SRC_DIR


RUN go get github.com/gorilla/mux;

RUN go install main.go


WORKDIR $GOBIN

ENTRYPOINT ["./main"]


EXPOSE 8080

发生的事情是:您CMD失败了,因为WORKDIR指向 bin 文件夹。


查看完整回答
反对 回复 2022-04-26
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信