我正在使用一个使用mongodb的简单go CRUD api,并将其移动到docker容器。由于某种原因,我无法连接到mongodb。经过研究,我找不到解决方案。
我尝试过:
这是我的compose.yml文件:
version: '3.4'
services:
mongodb:
image: mongo:4.0.4
restart: always
ports:
- 27017:27017
mongo_todo:
build: ./mongo_todo
ports:
- 3000:3000
depends_on:
- mongodb
go_todo:
build: ./go_todo
ports:
- 80:80
depends_on:
- mongo_todo
这是我的mongo_todo Dockerfile:
FROM golang:1.14
WORKDIR /go/src/app
COPY . .
RUN go get -d -v ./...
RUN go install -v ./...
EXPOSE 80
这就是我尝试连接到客户端的方式:
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://mongodb:27017")
// Connect to MongoDB
Client, _ = mongo.Connect(context.TODO(), clientOptions)
// Check the connection
err := Client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
当尝试ping客户端以检查连接时,程序记录了Fatel错误。
日志输出:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x2e0 pc=0x9a798c]
goroutine 1 [running]:
go.mongodb.org/mongo-driver/mongo.(*Client).Ping(0x0, 0xd61e20, 0xc000028030, 0x0, 0x1, 0x0)
/go/src/go.mongodb.org/mongo-driver/mongo/client.go:229 +0x21c
main.main()
/go/src/app/main.go:30 +0x16f
我知道这是某种网络问题,但是我不知道为什么它不起作用,而且我感觉我缺少一些简单的东西。
如果需要,请询问我更多信息,在此先感谢您的帮助。
编辑:我可以从go_todo容器ping主机名mongodb,所以不确定是否是网络问题。
答案 0 :(得分:1)
是的,这是使用docker-compose令人困惑(阅读:烦人)的一部分。
名为“ mongodb”的服务不是您将ApplyURI
设置为的容器名称。 docker-compose在容器名称前添加一个“项目名称”。
运行docker ps
,然后查找“ NAMES”列(应该是最后一个)。使用mongodb实例的名称作为URI主机,它应该可以连接。
答案 1 :(得分:0)
我是如此愚蠢,显然是docker noob。
我以为docker-compose up
重建了我的容器映像,但是没有重建,因此没有使用我的更改。
感谢您的评论,尽管我很感谢!
答案 2 :(得分:0)
您应该调试代码并检查哪个对象是 Nil。也许你正在调用 Nil 对象的方法。
我建议您明确创建一个 Docker network
并将您的 MongoDB docker 实例和您的应用程序附加到它。然后使用容器名称访问您的 MongoDB。我也遇到了连接问题,我使用 Docker network
解决了这个问题。
正如 @CenterOrbit 建议的那样,明确命名您的容器,否则 docker 会给它一个随机名称,并且您将无法连接到 MongoDB。