为什么我在Docker中使用Go获得404

时间:2019-10-20 07:13:47

标签: docker go routing

这是我的Dockerfile

FROM golang:alpine AS build
RUN apk --no-cache add gcc g++ make git
WORKDIR /go/src/app
COPY . .
RUN go get ./...
RUN GOOS=linux go build -ldflags="-s -w" -o ./bin/web-app ./main.go

FROM alpine:3.9
RUN apk --no-cache add ca-certificates
WORKDIR /usr/bin
COPY --from=build /go/src/app/bin /go/bin
EXPOSE 80
ENTRYPOINT /go/bin/web-app --port 80

这是一个简单的main.go:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir("./public")))
    log.Fatal(http.ListenAndServe(":80", nil))
}

公用目录与main.go文件位于同一文件夹中。公共目录中有一个index.html。 当我运行go run main.go时,我的网站可以正常运行。但是有了Docker,我得到了404页面。我怀疑这与docker容器中文件的放置有关。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我认为您需要在alpine容器中创建文件夹:

RUN mkdir -p /go/bin/public

并确保该文件夹中有内容。

或者您需要从第一个容器中复制文件夹和文件。

并编辑您的文档文件:

WORKDIR /go/bin
ENTRYPOINT web-app --port 80

答案 1 :(得分:1)

正如LinPy所提到的,您应该将公用文件夹从build复制到alpine

并且您必须将WORKDIR设置为/ go才能使相对路径起作用

例如

FROM golang:alpine AS build
RUN apk --no-cache add gcc g++ make git
WORKDIR /go/src/app
COPY . .
RUN go get ./...
RUN GOOS=linux go build -ldflags="-s -w" -o ./bin/web-app ./main.go

FROM alpine:3.9
RUN apk --no-cache add ca-certificates
WORKDIR /go
COPY --from=build /go/src/app/bin /go/bin
COPY --from=build /go/src/app/public /go/public
EXPOSE 80
ENTRYPOINT /go/bin/web-app --port 80