我目前正在用 Go 编写一个应用程序。我以前从未在 go 中这样做过,所以请耐心等待。我正在尝试通过 docker 愉快地为我的 swagger 文档提供服务。
我正在使用 redoc/redocly,但是当我容器化我的应用程序时,我无法再访问我配置为服务 swagger 文档的端点。
这是我的应用程序中有关 swagger 的代码:
sm := mux.NewRouter()
opts := middleware.RedocOpts{SpecURL: "/swagger.yaml"}
sh := middleware.Redoc(opts, nil)
sm.Handle("/docs", sh)
sm.Handle("/swagger.yaml", http.FileServer(http.Dir("./")))
s := &http.Server{
Addr: ":8080", // configure the bind address
Handler: sm, // set the default handler
ReadTimeout: 1 * time.Second, // max read time out for client
WriteTimeout: 1 * time.Second, // max time to write response to client
IdleTimeout: 120 * time.Second, // max time for connections using TCP keep-alive
}
go func() {
err := s.ListenAndServe()
if err != nil {
os.Exit(1)
}
}()
显然我可以使用我尝试过的 go-lang 中的内置文件服务器来提供静态文件。
当我从 VS Code 中运行应用程序时,上述内容按预期工作。
但是,当我容器化代码并运行 docker 容器时,当我导航到
http://localhost:8080/docs
时,我没有看到漂亮的 UI 中提供的 swagger 文档。
当我在网络浏览器(例如 Chrome)中检查网络工具时,它显示以下错误:
错误:无法加载http://localhost:8080/swagger.yaml:404 Not Found
有人可以告诉我我做错了什么吗? 我是否需要对代码或
Dockerfile
进行修改,以便我可以重新编写以提供文件。
更新 我正在分享我的 Dockerfile
FROM golang:1.16-alpine AS builder
# Set necessary environmet variables needed for our image
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# Move to working directory /build
WORKDIR /build
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
# Build the application
RUN go build -o main .
WORKDIR /dist
# Copy binary from build to main folder
RUN cp /build/main .
# Build a small image
FROM scratch
COPY --from=builder /dist/main /
EXPOSE 8080
# Command to run when starting the container
ENTRYPOINT ["/main"]
我处理这个问题的方法是将文件从已编译的 go 二进制文件中移出。您的 Dockerfile 应该是这样的:
FROM golang:1.23.1-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
RUN go mod verify
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -v -ldflags="-s -w" -o /app/gomaluum cmd/main.go
# use debug so can docker exec
FROM gcr.io/distroless/static-debian11:debug AS final
COPY --from=build /app/gomaluum /
COPY --from=build /app/swagger.json /
ENV ENVIRONMENT=production
USER nonroot:nonroot
EXPOSE 1323
ENTRYPOINT ["/gomaluum"]