Почему я получаю 404 с Go в докере - PullRequest
1 голос
/ 20 октября 2019

Это мой 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. Я подозреваю, что это связано с размещением файлов внутри контейнера докера. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Как уже упоминал 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
1 голос
/ 20 октября 2019

Я думаю, вам нужно создать папку в вашем alpine контейнере:

RUN mkdir -p /go/bin/public

и убедиться, что в этой папке что-то есть.

или вам нужно скопировать папкуи файлы из первого контейнера go.

и отредактируйте ваш dokcerfile:

WORKDIR /go/bin
ENTRYPOINT web-app --port 80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...