gpt4 book ai didi

docker - 它说 “connection reset”不能使Docker容器在本地主机上运行?

转载 作者:行者123 更新时间:2023-12-01 21:22:08 24 4
gpt4 key购买 nike

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

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

  • curl 服务器时出错:

    curl -X GET http://localhost:8080
    curl: (52) Empty reply from server


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


    最佳答案

    您正在以分离(-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

    关于docker - 它说 “connection reset”不能使Docker容器在本地主机上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59417246/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com