1 回答
TA贡献1817条经验 获得超6个赞
这里有几个问题。
首先和MONGODB_INITDB_ROOT_USERNAME都是MONGODB_INITDB_ROOT_PASSWORD错误的。他们应该是MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_USERNAME。
问题是mongo1启动后不久就会崩溃,因为它需要一个secret.key. 检查日志,您将看到错误。解决这个问题是另一个问题。
我建议先尝试不进行身份验证。这是有效的方法:
您缺少的步骤:
echo 127.0.0.1 mongo1 >> /etc/hosts
数据库启动脚本:
#!/bin/bash
docker container rm -f mongo1 mongo2 mongo3
docker run -d -p 27017:27017 --name mongo1 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all
docker run -d -p 27018:27017 --name mongo2 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all
docker run -d -p 27019:27017 --name mongo3 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all
docker exec -it mongo1 mongosh --eval "rs.initiate({
_id: \"myReplicaSet\",
members: [
{_id: 0, host: \"mongo1\"},
{_id: 1, host: \"mongo2\"},
{_id: 2, host: \"mongo3\"}
]
})"
go中的测试程序:
package main
import (
"context"
"fmt"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
const uri = "mongodb://mongo1:27017/task?replicaSet=myReplicaSet&retryWrites=true&w=majority"
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()
if err := client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
}
fmt.Println("Successfully connected and pinged")
}
运行这个,你应该得到一个成功的响应:
> go run ./main.go
Successfully connected and pinged
另外我认为您不需要映射主机上的所有副本端口。这应该使事情更清洁。
- 1 回答
- 0 关注
- 91 浏览
添加回答
举报