【问题标题】:Inserting data in a dockerized mongodb on startup在启动时在 dockerized mongodb 中插入数据
【发布时间】:2020-09-23 17:33:17
【问题描述】:

我正在尝试使用我正在处理的节点 API 的 mongodb 实例运行本地 docker 设置。我正在使用找到 here 的 docker 镜像。

我的Dockerfile 如下所示:

FROM mongo
ENV MONGO_INITDB_ROOT_USERNAME root
ENV MONGO_INITDB_ROOT_PASSWORD pw
ENV MONGO_INITDB_DATABASE foo
ADD scripts/init.js /docker-entrypoint-initdb.d/

我想要实现的是,在我的 docker 容器启动时,我想向 mongodb 插入一些虚拟数据,例如:

db.collection('bar').insertOne({foo: 'foo'});
db.collection('bar').insertOne({foo: 'bar'});
db.collection('bar').insertOne({foo: 'baz'});

在官方文档中提到

当一个容器第一次启动时,它会执行文件 带有扩展名 .sh 和 .js 在 /docker-entrypoint-initdb.d。文件将按字母顺序执行 命令。 .js 文件将由 mongo 使用数据库执行 由 MONGO_INITDB_DATABASE 变量指定(如果存在),或 否则测试。您也可以在 .js 脚本中切换数据库。

我遇到了几个问题。运行db.collection('bar) 会告诉我db.collection is not a function

我已经在 stackoverflow 上查看并尝试了许多不同的解决方案(切换到 docker-compose、使用不同的脚本、创建新用户?等等),但我仍然没有在本地运行任何东西。

如何在启动时在 mongo db 中简单地插入一些虚拟数据?我非常喜欢坚持简单的Dockerfile,而不是切换到任何不同的东西。我只想让我的初始化脚本运行,并使用几个db.collection('bar').insertOne({}) 插入数据。

此外,在 Docker 仪表板(在 mac 上)中,当我单击我的容器时,单击“CLI”按钮,然后键入以下内容:

⚡ docker exec -it 8430a5d39fbfd5e77a034bb563e3ebcaabbd6736c62121740420a190804fcef /bin/sh; exit
# mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("58a59bd0-2fe5-4345-95a3-b78c70f65707") }
MongoDB server version: 4.4.1
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    https://docs.mongodb.com/
Questions? Try the MongoDB Developer Community Forums
    https://community.mongodb.com
> show dbs
> show collections
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
> db.auth("root", "pw")
Error: Authentication failed.
0
> 

我似乎无法进行身份验证,即使我在我的Dockerfile 中设置了MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD,我想了解为什么会发生这种情况以及如何解决它。

感谢阅读!

【问题讨论】:

    标签: mongodb docker


    【解决方案1】:

    查看latest mongodb documentation,我找不到任何对db.collection(collectionName) 的引用。

    但是,我确实找到了对 db.createCollection(collectionName)db.getCollection(collectionName) 的引用。

    通过修改脚本以使用这些函数,我可以让 docker 实例正确启动。这可能是因为您使用了FROM mongo:latest 图像。

    您可以找到完整的拉取请求here,但简而言之,您的 Dockerfile 是正确的,脚本应该只使用文档中可见的函数。

    在mongodb中第一次启动时运行脚本的方式确实是使用COPY scripts/init.js /docker-entrypoint-initdb.d/命令。

    我猜是你习惯的node库和docker镜像使用的db功能不一样。

    关于连接数据库,如果你想避免管理员登录,你应该使用mongodb://user:password@mongourl:port/dbname格式。

    在这种特定情况下,类似于mongodb://user:password@localhost:27017/customelements

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多