gpt4 book ai didi

mongodb - docker-compose 使用用户名和密码创建 mongo 容器

转载 作者:IT老高 更新时间:2023-10-28 13:23:11 30 4
gpt4 key购买 nike

我在 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 创建的同一网络中

最佳答案

mongo:latest image 在撰写本文时 (v 3.5) 接受两个环境变量,MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD

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

这目前没有记录在他们的README中,但是有一个GitHub issue跟踪这件事的进展,源代码位于 docker-entrypoint.sh104 行脚本。

要在 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

关于mongodb - docker-compose 使用用户名和密码创建 mongo 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112200/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com