使用docker-compose创建带有用户名和密码的Mongo容器

10

我有一个在Compose中创建的Mongo容器:

version: '2'
volumes:
  mongodata:
    driver: local
services:
  mongo:
    image: mongo:latest
    hostname: ${MONGODB_HOST}
    restart: always
    ports: 
      - "27017:27017"
    volumes:
      - mongodata:/data/db

这个方法很完美,但现在我想在数据库上设置密码。为此,首先我需要创建数据库,添加密码,然后使用--auth标志重新启动它。我的问题是如何使用docker-compose完成此过程。

如果我不使用docker-compose,我可以做到这一点。我能看到使用compose可能会遇到的问题有:

a) docker-compose工作在docker网络中。 b) 在开始时,docker-compose不能运行不同的命令,与生产环境不同。这很重要,因为尽管有些人说你可以在开始时运行--auth,并且它会允许您第一次设置密码,但事实并非如此。

我开始着手解决的一个解决方案是,在运行docker-compose文件之前,我将在所有服务器上运行一个shell脚本:

# start the temporary container
docker run -d -v /tmp/mongodb --name tmpdb -e MONGODB_DBNAME=db_test mongo --auth
# do the user creation
docker run -it --link tmpdb --rm mongo sh -c 'mongo --host tmpdb --eval "db.createUser({ user: \"admin\", pwd: \"password\", roles: [ { role: \"root\", db: \"admin\" } ] });"'
# stop the server
docker stop tmpdb
# create new mongodb container, using the old ones data
docker run -d -p 27017:27017 --name mongo2 -e MONGODB_DBNAME=db_test mongo --auth
# clean up old container (we are using the volumes so they will stick around)
docker rm tmpdb

该文件创建一个临时容器,在其上设置用户名/密码,停止原始容器,使用旧容器的卷容器创建新容器,然后删除原始容器。 新的mongo容器现在已经设置了密码。

那么我的最终问题是,在docker-compose中做这件事的最佳方法是什么?

我docker-compose文件中的其他容器需要能够访问mongo,因此我认为保持mongo数据的卷容器需要在docker-compose创建的相同网络中。

1个回答

9

在撰写本文时(版本为3.5),mongo:latest镜像接受两个环境变量,MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD

当设置这些变量时,容器的入口脚本将使用--auth启动mongod服务,然后使用提供的凭据创建管理员用户。

目前这在他们的README中没有记录,但有一个GitHub issue跟踪此事的进展,并且源代码可在docker-entrypoint.sh脚本的第104行上找到。

要在docker-compose.yml中使用这些变量,请参阅以下代码片段:

version: '3'
services:
  mongodb:
    image: mongo:3.5
    hostname: ${MONGODB_HOST}
    environment:
      - MONGO_INITDB_ROOT_USERNAME=alice
      - MONGO_INITDB_ROOT_PASSWORD=super-secret-password
    restart: on-failure
    ports:
      - 27017:27017
    volumes:
      - ./mongodb:/data/db

嗨!有没有一种方式可以在不创建管理员用户的情况下使用--auth启动Mongo? - Muskan
1
@Muskan 尝试移除 environment: 部分并添加 command: mongod --auth - alecdwm
抱歉,我认为那个不起作用,但这个可以:命令:[--auth] - Muskan
@Muskan 是的,你可以使用设置了 authorization: true 的 mongodb.conf 挂载卷。 - Suroor Ahmmad
如何在已有的数据库上使其工作?例如,我想通过Compose文件引入身份验证,但是该数据库已经存在于先前的服务中。 - Xoyce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接