如何在启动时为 MongoDB 容器创建数据库?

新手上路,请多包涵

我正在使用 Docker,并且我有一个包含 PHP、MySQL、Apache 和 Redis 的堆栈。我现在需要添加 MongoDB,所以我正在检查 Dockerfile 的最新版本以及来自 MongoDB Dockerhub 的 docker-entrypoint.sh 文件,但我找不到设置默认数据库、管理员用户/密码和可能的身份验证的方法来自 docker-compose.yml 文件的容器的方法。

在 MySQL 中,您可以设置一些 ENV 变量,例如:

 db:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

这会将数据库和用户/密码设置为 root 密码。

有没有办法用 MongoDB 实现同样的目标?任何人都有一些经验或解决方法?

原文由 ReynierPM 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

/data/db 目录中没有任何内容时,docker hub mongo 图像将运行 /docker-entrypoint-initdb.d/ 中的任何脚本。

数据库初始化

The mongo container image provides the /docker-entrypoint-initdb.d/ path to deploy custom .js or .sh setup scripts that will be run once on database initialisation. .js 默认情况下,脚本将针对 testMONGO_INITDB_DATABASE 如果在环境中定义。

 COPY mysetup.sh /docker-entrypoint-initdb.d/

或者

COPY mysetup.js /docker-entrypoint-initdb.d/

一个简单的初始化 mongo shell javascript 文件,演示设置 container 收集数据、日志记录以及如何退出错误(用于结果检查)。

 let error = true

let res = [
  db.container.drop(),
  db.container.createIndex({ myfield: 1 }, { unique: true }),
  db.container.createIndex({ thatfield: 1 }),
  db.container.createIndex({ thatfield: 1 }),
  db.container.insert({ myfield: 'hello', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello2', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello3', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello3', thatfield: 'testing' })
]

printjson(res)

if (error) {
  print('Error, exiting')
  quit(1)
}

管理员用户设置

控制“root”用户设置的环境变量是

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

例子

docker run -d \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  mongod

Dockerfile

 FROM docker.io/mongo
ENV MONGO_INITDB_ROOT_USERNAME admin
ENV MONGO_INITDB_ROOT_PASSWORD password

您不需要在命令行上使用 --auth 作为 entrypoint.sh 脚本在检测到环境变量存在时添加它。

原文由 Matt 发布,翻译遵循 CC BY-SA 4.0 许可协议

这里使用 docker-composejs 脚本的另一个更清洁的解决方案。

此示例假定两个文件(docker-compose.yml 和 mongo-init.js)位于同一个文件夹中。

码头工人-compose.yml

 version: '3.7'

services:
    mongodb:
        image: mongo:latest
        container_name: mongodb
        restart: always
        environment:
            MONGO_INITDB_ROOT_USERNAME: <admin-user>
            MONGO_INITDB_ROOT_PASSWORD: <admin-password>
            MONGO_INITDB_DATABASE: <database to create>
        ports:
            - 27017:27017
        volumes:
            - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro

mongo-init.js

 db.createUser(
        {
            user: "<user for database which shall be created>",
            pwd: "<password of user>",
            roles: [
                {
                    role: "readWrite",
                    db: "<database to create>"
                }
            ]
        }
);

然后只需运行以下 docker-compose 命令即可启动服务

docker-compose up --build -d mongodb

注意: docker-entrypoint-init.d 文件夹中的代码仅在数据库之前从未初始化过的情况下才会执行。

原文由 Paul Wasilewski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题