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

无法让 Docker 容器在 localhost 上运行,它在访问 localhost:8080 时显示“连接重置”。以下是我所知道的,请耐心等待:


代码在我运行时在本地运行,我可以看到http://localhost:8080页面

Docker 构建命令完成且没有错误

卷曲服务器时出错:


curl -X GET http://localhost:8080

curl: (52) 来自服务器的空回复


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


Dockerfile:


 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 main


import (

    "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)

}


回首忆惘然
浏览 151回答 2
2回答

猛跑小猪

您正在以分离 ( -d) 模式启动图像 - 这就是您看不到错误消息的原因。的问题很少Dockerfile,应该使用@andre 答案修复,但很可能您忘记重建图像并且没有看到效果。我提交此答案是为了建议您对以下内容进行一些改进Dockerfile:# first stage - builds the binary from sourcesFROM golang:1.12.14-alpine3.10 as build# using build as current directoryWORKDIR /build# Add the source code:COPY main.go ./# install build depsRUN apk --update --no-cache add git# downloading dependencies and# building server binaryRUN go get github.com/gorilla/mux && \&nbsp; go build -o server .# second stage - using minimal image to run the serverFROM alpine:3.10# using /app as current directoryWORKDIR /app# copy server binary from `build` layerCOPY --from=build /build/server server# binary to runCMD "/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 最佳实践。

繁花不似锦

你WORKDIR是错的,基于你如何设置你的CMD改变你的WORKDIR,SRC_DIR而不是,GOBIN它会工作你也可以go install main.go在你的 Dockerfile 上运行go install将创建可执行文件并将其移动到 bin 文件夹这是一个工作 Dockerfile 的示例:FROM golang:1ENV SRC_DIR=/go/src/ENV GOBIN=/go/binWORKDIR $SRC_DIR# Add the source code:ADD . $SRC_DIRRUN go get github.com/gorilla/mux;RUN go install main.goWORKDIR $GOBINENTRYPOINT ["./main"]EXPOSE 8080发生的事情是:您CMD失败了,因为WORKDIR指向 bin 文件夹。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go