Golang中Docker容器与Swagger集成报错问题排查
Golang中Docker容器与Swagger集成报错问题排查 我构建了一个Docker镜像,但在运行时似乎失败了。访问URL http://localhost:1323/doc/index.html 返回ERR_CONNECTION_REFUSED错误。有什么想法吗?
这是我的main.go文件:
package main
import (
"net/http"
_ "testSwagger/docs"
"github.com/gorilla/mux"
"github.com/swaggo/http-swagger"
)
// @title API
// @version 1.0
// @description This is a sample API for testing Swagger
func main() {
router := mux.NewRouter()
router.StrictSlash(true)
router.PathPrefix("/doc").Handler(httpSwagger.WrapHandler)
println("Running api server at port 1323")
http.ListenAndServe(":1323", router)
}
这是我的dockerfile:
FROM golang:alpine AS builder
RUN apk update && apk add --no-cache git
WORKDIR $GOPATH/src/testSwagger/
COPY . .
RUN go get -d -v
RUN go build -o /go/bin/testSwagger
FROM alpine:latest
COPY --from=builder /go/bin/testSwagger /
CMD ["/testSwagger"]
EXPOSE 1323
更多关于Golang中Docker容器与Swagger集成报错问题排查的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我使用以下命令启动容器: docker run image_name
更多关于Golang中Docker容器与Swagger集成报错问题排查的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
不,它位于 run 和镜像名称之间。
正如我所说,你需要提供 -p 1323:1323。
正确的语法是什么? docker run image_name -p 1323:1323
好的,关于Go的内容就到这里。Docker支持属于离题内容。
哦,是的,这是个已知问题。重启 Docker 后,第二次就能正常工作了。现在一切都正常了 ^^ 非常感谢
Fookiwara:
运行时似乎失败了。
发生了什么情况?你运行的容器向控制台或日志输出了什么内容?
你是如何启动容器的?暴露端口仅意味着该端口对Docker网络开放,若要从外部世界(包括您的主机)访问该端口,您还需要使用 -p 参数来发布它。
那么你可以按照之前提到的方法使用 -p 选项来暴露容器的端口,或者使用容器的 IP 地址而不是 localhost。你可以通过 docker inspect 命令来查找该 IP 地址。
我遇到了这个错误:
C:\Users\Ahmad-admin>docker run -p 1323:1323 test_swagger:latest
docker: Error response from daemon: driver failed programming external connectivity on endpoint hungry_morse (4942c4a453590820735996d3f11c94aa9c7b216431facf4fc1c707bfc28c4c1b): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:1323:tcp:172.17.0.21:1323: input/output error.
问题在于你的Docker容器没有正确绑定到主机的网络接口。在Docker中,http.ListenAndServe(":1323", router) 默认绑定到容器的localhost,而不是所有接口。
修改main.go文件,将监听地址改为0.0.0.0:1323:
package main
import (
"net/http"
_ "testSwagger/docs"
"github.com/gorilla/mux"
"github.com/swaggo/http-swagger"
)
// @title API
// @version 1.0
// @description This is a sample API for testing Swagger
func main() {
router := mux.NewRouter()
router.StrictSlash(true)
router.PathPrefix("/doc").Handler(httpSwagger.WrapHandler)
println("Running api server at port 1323")
http.ListenAndServe("0.0.0.0:1323", router) // 修改这里
}
同时确保你的Docker运行命令正确映射端口:
docker run -p 1323:1323 your-image-name
这样配置后,容器内的服务会监听所有网络接口,端口映射也会正确工作,访问http://localhost:1323/doc/index.html应该就能正常显示Swagger文档了。

