我使用的是一个简单的go,它使用MongoDB并将其移动到坞容器中。由于某些原因,我无法连接到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文档:
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)
}当试图平压客户端以检查连接时,程序正在记录一个致命错误。
日志输出:
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容器中平掉主机名mongodb,所以不确定它是否是网络问题。
发布于 2020-03-18 19:19:31
是的,这是有点混乱(读:烦人)的一部分使用码头-撰写。
名为mongodb的服务不是您将ApplyURI设置为的容器名称。docker-将“项目名称”作为容器名称的前缀。
运行一个docker ps并查找'NAMES‘列(应该是最后一个)。为URI主机使用mongodb实例的名称,它应该连接。
发布于 2020-03-18 21:27:11
我太蠢了,显然是个码头工人。
我认为docker-compose up重建了我的容器映像,但它没有,所以我的更改没有被使用。
谢谢你的评论,尽管我很感激!
发布于 2021-01-04 10:32:56
您应该调试代码并检查哪个对象是Nil。也许您正在调用Nil对象上的方法。
我建议您显式地创建一个Docker network,并将您的MongoDB停靠实例和应用程序附加到它。然后使用容器名访问MongoDB。我也面临着连接问题,我用Docker network解决了这个问题。
正如@CenterOrbit建议的那样,显式地命名容器,否则对接者会给它一个随机的名称,您将无法连接到MongoDB。
https://stackoverflow.com/questions/60742259
复制相似问题