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

时间:2019-12-19 21:44:47

标签: docker go

无法使Docker容器在localhost上运行,它在转到localhost:8080时显示“连接重置”。 这是我所知道的,所以请多多包涵:

  1. 代码在运行时在本地运行,并且能够看到http://localhost:8080页面
  2. Docker build命令完整无误

卷曲服务器时出错:

  

卷曲-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

以下是转到代码:

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


2 个答案:

答案 0 :(得分:1)

根据您的WORKDIR设置方式,您的CMD是错误的

将您的WORKDIR更改为SRC_DIR,而不是GOBIN

您还可以在Dockerfile上运行go install main.go

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文件夹。

一些注意事项:

请勿执行:RUN cd,按照:Docker : RUN cd ... does not work as expected

答案 1 :(得分:1)

您正在以分离(-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分为两个阶段:构建和运行。构建阶段负责构建服务器二进制文件,运行阶段负责运行服务器二进制文件。参见https://docs.docker.com/develop/develop-images/multistage-build/
然后,我将多个RUN合并为一个:go get github.com/gorilla/mux && go build -o server .,以避免创建多余的层。
我修复了WORKDIR,并为其赋予了可读的语义名称。

别忘了用docker build . -t goserver重建它并用它运行

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

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

此外,您可能需要检查Dockerfile best practices