docker - 为什么我在 docker 中使用 Go 得到 404
问题描述
这是我的 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 容器内有关。任何帮助表示赞赏。
解决方案
正如 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
推荐阅读
- c++ - 在模板类中重载 istream>> 和 ostream<<
- java - 如果在其他地方注入相同的值而没有注释,@ConfigurationProperties 不会更新
- vhdl - 我在计数器中定义“计数”的方式类型的 VHDL 错误
- php - 使用 Guzzle 访问 secretsmanager 查询 API
- php - 显示 file_put_contents() 到视图 Codeigniter 的百分比进度
- android - 无法在底部导航中维护数据
- r - 根据 NLCD(土地覆盖数据)栅格计算的县域太大
- java - 如何防止我的代码在以下代码中重写相同索引号中的值
- python-sphinx - 如何在 jupyterbook 中设置 sphinx 默认域
- python - Python Snake Tickspeed 问题