You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go API容器化后Swagger UI访问404问题求助

问题解决方案:容器化Go API后Swagger UI 404错误

容器化后Swagger UI无法访问的核心问题是Docker镜像中缺失生成的docs文件夹,同时路由配置与容器内文件路径不匹配,以下是具体修复步骤:

1. 修正Dockerfile,复制docs目录到镜像

当前Dockerfile未将本地生成的docs文件夹复制到容器内,导致Swagger无法加载doc.json。更新Dockerfile:

FROM golang:alpine AS builder

WORKDIR /hotelservice
COPY ./go.mod ./go.sum ./
RUN go mod download

# 新增:复制Swagger生成的docs文件夹
COPY docs/ ./docs/
COPY hotelservice/ ./hotelservice/
COPY hotel-lib/ ./hotel-lib/
COPY protos/ ./protos/
COPY .env ./
RUN go build -o hotel-service ./hotelservice/cmd/main.go
CMD ["./hotel-service"]

2. 调整Swagger路由与文件路径配置

在main.go中,确保路由能正确映射到容器内的Swagger资源,同时指定正确的doc.json路径:

// 先添加静态文件服务,处理docs目录下的资源
mux.Handle("/swagger/", http.StripPrefix("/swagger/", http.FileServer(http.Dir("./docs"))))

// 配置Swagger UI Handler,指向静态服务暴露的doc.json路径
mux.Handle("/swagger/index.html", httpSwagger.Handler(
    httpSwagger.URL("/swagger/doc.json"),
))

如果更倾向于用单个Handler处理,也可以直接指定容器内doc.json的绝对路径对应的URL:

mux.Handle("/swagger/*", httpSwagger.Handler(
    httpSwagger.URL("/docs/doc.json"),
))

注意:需确保代码中已正确导入docs包:

import _ "your-project-module-path/docs"

3. 验证容器内文件结构(可选)

构建镜像并启动容器后,可进入容器确认文件是否存在:

docker exec -it <你的容器ID> ls /hotelservice/docs

需确认doc.json及其他Swagger相关文件存在。

4. 调整Docker Compose卷挂载(可选)

如果保留本地代码挂载,需确保卷路径与容器工作目录一致,避免路径混淆:

volumes:
  - .:/hotelservice

(生产环境建议依赖Dockerfile复制代码,而非卷挂载)

5. 确认Swagger生成的文件正确性

确保在项目根目录执行过swag init,生成的docs文件夹包含完整的doc.json,且文件内的host配置无需修改为服务名称(通过本地localhost:8081访问时,保持默认即可)。

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:38:13