mongodb - 当我尝试为数据库创建新用户时自定义 mongo docker 引发错误

标签 mongodb docker dockerfile

我正在使用 mongo docker 镜像。当我尝试为新数据库创建用户和密码时出现错误。

这是我的 Dockerfile:

FROM mongo

ENV AUTH yes
ENV JOURNALING yes    

ADD run.sh /usr/bin/run.sh
ADD set_mongodb_password.sh /usr/bin/set_mongodb_password.sh

RUN chmod +x /usr/bin/run.sh && chmod +x /usr/bin/set_mongodb_password.sh

EXPOSE 27017 28017

CMD ["/usr/bin/run.sh"]

好的,现在我的运行脚本:

#!/bin/bash

cmd="mongod"
if [ "$AUTH" == "yes" ]; then
    cmd="$cmd --auth"
fi

if [ "$JOURNALING" == "no" ]; then
    cmd="$cmd --nojournal"
fi

$cmd &

if [ ! -f /data/db/.mongodb_password_set ]; then
    set_mongodb_password
fi

fg

和我的 set_mongodb_password 脚本:

#!/bin/bash

USER=${MONGO_USER:-"mongo"}
PASS=${MONGO_PASSWORD:-"mongo"}
DB=${MONGO_DB:-"testdb"}

echo "=> Creating database < ${DB} > with an user < ${USER} > and password  < ${PASS} > in MongoDB"

echo "=> Creating database"
mongo $DB --eval "db.getSiblingDB('${DB}');"

echo "=> Creating user and password"
mongo $DB --eval "db.createUser({user: '${USER}', pwd: '${PASS}', roles:[ { role:'readWrite',db: '${DB}'} ]  } ) ;"
#mongo admin --eval "db.createUser({user: 'mongo', pwd: '${PASS}', roles:[{role:'readWrite',db:'$DB'}]});"

echo "=> Done!"
touch /data/db/.mongodb_password_set

echo "========================================================================"
echo "You can now connect to this MongoDB server using:"
echo ""
echo "    mongo ${DB} -u ${USER} -p ${PASS} --host <host> --port <port>"
echo ""
echo "Please remember to change the above password as soon as possible!"
echo "========================================================================"

我构建并创建了我的 mongo 图像,因此当我尝试连接用户和密码时,它会返回身份验证错误。然后我使用 docker exec 命令进入我的 mongo 容器并手动运行 set_mongodb_password 脚本,我收到以下错误:

2015-08-05T06:08:50.550+0000 E QUERY    Error: couldn't add user: not authorized on pepedb to execute command { createUser: "pepe", pwd: "xxx", roles: [ { role: "readWrite", db: "pepedb" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } }
    at Error (<anonymous>)
    at DB.createUser (src/mongo/shell/db.js:1101:11)
    at (shell eval):1:4 at src/mongo/shell/db.js:1101

所以,我不知道如何解决这个错误。当我使用简单的 mongo 图像并运行它时。我可以进入容器并逐步运行我的 set_mongodb_password 脚本的内容,一切正常。所以我不明白问题出在哪里。也许我在配置或一些 mongo 参数中遗漏了一些东西。有什么帮助吗?

最佳答案

您在 run.sh 和 set_mongodb_password.sh 中有一些错误。

在脚本 run.sh 中,您需要在 #!bash 行之后添加“set -m”,因为在最后一行中您使用了 fg。阅读帖子 https://unix.stackexchange.com/questions/196603/can-someone-explain-in-detail-what-set-m-does理解“set -m”和“fg”。

在同一个脚本中,您需要像/usr/bin/set_mongodb_password.sh 一样调用 set_mongodb_password 而不是 set_mongodb_password

set_mongodb_password.sh 的问题在于它运行在run.sh 之前,所以需要在"#!bash"之后添加下面这行以等待mongo 启动:

RET=1
while [[ RET -ne 0 ]]; do
    echo "=> Waiting for confirmation of MongoDB service startup"
    sleep 5
    mongo admin --eval "help" >/dev/null 2>&1
    RET=$?
done

完成此操作后,您将能够执行 mongo 命令并创建所需的用户。

关于mongodb - 当我尝试为数据库创建新用户时自定义 mongo docker 引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841304/

相关文章:

sockets - 有没有直接的方法从 Go 中的 unix 套接字获取 html 响应(就像 curl 一样)?

.net - 将基于.net core 5.0的python 3.8安装到Docker

javascript - 如果mongodb中存在相同的key,如何更新数据?

php - 我可以将完整的 MySQL 数据库从基于 PHP 的站点移动到 Django 应用程序吗?

c# - 如何在 c# foreach 循环中使用 MongoDB 的 Query 和 QueryBuilder?

ubuntu - Docker ubuntu 容器可以 ping archive.ubuntu.com 但不能 apt-get

python - 即使在dockerfile/requirements.txt中添加了numpy之后,在docker容器中使用numpy运行python代码的“Module not found error”

多阶段构建中的 Docker-Compose Args(变量扩展)

docker - 无法使用Dockerfile中的参数执行Shell脚本

node.js - 为什么 mongodb 中的 addToSet 在数组字段中不起作用?