无法使Docker容器在localhost上运行,它在转到localhost:8080时显示“连接重置”。 这是我所知道的,所以请多多包涵:
卷曲服务器时出错:
卷曲-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)
}
答案 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。