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

12 回复

我使用以下命令启动容器: 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文档了。

回到顶部