Go mongo驱动程序无法连接到mongodb容器

时间:2020-03-18 15:05:21

标签: mongodb docker go docker-compose

我正在使用一个使用mongodb的简单go CRUD api,并将其移动到docker容器。由于某种原因,我无法连接到mongodb。经过研究,我找不到解决方案。

我尝试过:

  • 公开/发布端口,以便在尝试连接到客户端时可以使用容器名称代替“ mongodb:localhost:27017 /”。
  • 我还删除了compose.yml文件中的所有网络配置,以免造成网络混乱。

这是我的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,所以不确定是否是网络问题。

3 个答案:

答案 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。