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
相关产品推荐
相关产品推荐

