在容器化 Go 应用程序中提供 Swagger 文件的问题

问题描述 投票:0回答:1

我目前正在用 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 swagger
1个回答
0
投票

我处理这个问题的方法是将文件从已编译的 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"]
© www.soinside.com 2019 - 2024. All rights reserved.