【问题标题】:MongoDB Docker init scriptMongoDB Docker 初始化脚本
【发布时间】:2020-10-23 21:39:58
【问题描述】:

我正在尝试在 Docker 中播种我的 MongoDB。 我的 docker-compose.yml 文件非常简单,这是我的 音量:

...
volumes:
      - ./mongo/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
      - ./mongo/mongod.conf:/etc/mongod.conf:ro
      - ./mongo/mongo-volume:/data/db
...

我将 init-mongo.js 映射为一个卷,这是它的内容:

db.createUser({
  user: 'root',
  pwd: 'toor',
  roles: [
    {
      role: 'readWrite',
      db: 'testDB',
    },
  ],
});
db.createCollection('users', { capped: false });
db.createCollection('test', { capped: false });

db.test.insert([
  { "item": 1 },
  { "item": 2 },
  { "item": 3 },
  { "item": 4 },
  { "item": 5 }
]);

用户root和数据库testDB以及集合userstest都创建没有问题。

问题是db.test.insert([]) 似乎一起被遗漏了,并且没有文档被插入到test 集合中。

任何想法为什么会这样? 我非常愿意让这个工作,并且非常感谢任何帮助。

谢谢, -凯文

【问题讨论】:

  • 创建用户运行没有问题,我在使用行出现错误:未捕获的异常:SyntaxError:意外令牌:标识符:@/docker-entrypoint-initdb.d/mongo-init.js :14:4 加载失败:/docker-entrypoint-initdb.d/mongo-init.js 我已经稍微更改了文件,但错误出现在“使用 testdb”行(我的文件中没有引号)跨度>

标签: mongodb docker docker-compose


【解决方案1】:

将您的 init-mongo.js 文件更改为此首先选择新数据库,然后创建集合,最后将数据植入其中:

db.createUser({
    user: 'root',
    pwd: 'toor',
    roles: [
        {
            role: 'readWrite',
            db: 'testDB',
        },
    ],
});

db = new Mongo().getDB("testDB");

db.createCollection('users', { capped: false });
db.createCollection('test', { capped: false });

db.test.insert([
    { "item": 1 },
    { "item": 2 },
    { "item": 3 },
    { "item": 4 },
    { "item": 5 }
]);

然后登录mongo shell(使用mongo -u [admin_username] -p)并检查testDB集合中的数据:

use testDB;
db.getCollection('test').find()

这将显示:

{ "_id" : ObjectId("5f947906cc845282e5711728"), "item" : 1 }
{ "_id" : ObjectId("5f947906cc845282e5711729"), "item" : 2 }
{ "_id" : ObjectId("5f947906cc845282e571172a"), "item" : 3 }
{ "_id" : ObjectId("5f947906cc845282e571172b"), "item" : 4 }
{ "_id" : ObjectId("5f947906cc845282e571172c"), "item" : 5 }

【讨论】:

  • 是否需要在这个js文件中导入'Mongo'才能使用'Mongo()'?
【解决方案2】:

我认为您已连接到管理数据库,对吗?用户通常在 admin db 上创建。

在运行插入之前尝试使用“testDB”数据库重新初始化您的数据库。

【讨论】: