Я использую образ Docker MongoDB по умолчанию и пытаюсь создать нового пользователя для база данных.
Сейчас я пытаюсь сделать это следующим образом:
FROM docker.io/mongo:3.2
MAINTAINER <alexandernst> alexandernst@gmail.com
ADD create_ddbb.js /tmp/
RUN mongod --fork --logpath /var/log/mongodb.log \
&& sleep 5 && mongo foobar /tmp/create_ddbb.js
И create_ddbb.js
:
db.createUser(
{
user: "*******",
pwd: "*******************",
roles: [
{ role: "readWrite", db: "foobar" }
]
}
);
И когда я создаю Dockerfile, я вижу:
Step 4 : RUN mongod --fork --logpath /var/log/mongodb.log && sleep 5 && mongo foobar /tmp/create_ddbb.js
---> Running in 58ba44d02508
about to fork child process, waiting until server is ready for connections.
forked process: 9
child process started successfully, parent exiting
MongoDB shell version: 3.2.6
connecting to: foobar
Successfully added user: {
"user" : "***********",
"roles" : [
{
"role" : "readWrite",
"db" : "foobar"
}
]
}
---> e73b6c8c8b83
Removing intermediate container 58ba44d02508
Successfully built e73b6c8c8b83
Итак, пользователь создан, но затем, когда я пытаюсь подключиться, я получаю:
mongo_1 | 2016-05-13T17:44:02.159+0000 I NETWORK [initandlisten] connection accepted from 172.20.0.4:41294 #1 (1 connection now open)
mongo_1 | 2016-05-13T17:44:02.160+0000 I ACCESS [conn1] SCRAM-SHA-1 authentication failed for ********* on foobar from client 172.20.0.4 ; UserNotFound: Could not find user *********@foobar
mongo_1 | 2016-05-13T17:44:02.160+0000 I NETWORK [conn1] end connection 172.20.0.4:41294 (0 connections now open)
Почему это происходит? Как я могу сохранить созданного пользователя?
Мое решение:
Внутри вашего Dockerfile
:
ADD create_ddbb.js /tmp/
RUN mongod -f /etc/mongod.conf --fork --logpath /var/log/mongodb.log \
&& sleep 5 \
&& mongo <YOUR DATABASE> /tmp/create_ddbb.js
Внутри create_ddbb.js
:
db.createUser(
{
user: "your_user",
pwd: "********************",
roles: [
{ role: "dbOwner", db: "your_database" }
]
}
,
{
w: "majority",
wtimeout: 5000
}
);
db.createCollection("test");
createColleciton ( "тест")
в конце чрезвычайно важен. Без этого createUser
не применяется. Не знаю почему, извините.
пользователь должен быть добавлен в базу данных администратора следующим образом:
ЗАПУСТИТЬ mongod --fork --logpath /var/log/mongodb.log \
&& sleep 5 && mongo foobar /tmp/create_ddbb.js[12102 impression
Я не смог запустить решение @alexandernst. В сочетании с https://github.com/docker-library/mongo/issues/329 мне просто нужно было создать свой Dockerfile, и он изнашивался.
FROM docker.io/mongo:latest
COPY create_ddbb.js /docker-entrypoint-initdb.d/
Файл create_ddbb.js был похож на файл @alexandernst, но без последней строки, создающей тестовую коллекцию.
Я не использовал Dockerfile. Вместо этого я использовал docker-compose.yml для указания контейнера. Ниже приведено содержимое docker-compose.yml
version: "3.7"
services:
mongo:
container_name: container-mongodb
image: mongo:latest
restart: always
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
MONGO_INITDB_DATABASE: root-db
volumes:
- ./docker-entrypoint-initdb.d/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
Создайте каталог docker-entrypoint-initdb.d
и создайте файл mongo-init.js
. и введите приведенный ниже код, чтобы добавить пользователя.
print("Started adding the users.");
db = db.getSiblingDB("admin");
db.createUser({
user: "userx",
pwd: "1234",
roles: [{ role: "readWrite", db: "admin" }],
});
print("End adding the user roles.");
Затем запустите docker compose из каталога, в котором вы сохранили docker compose.yml. Дерево файлов должно выглядеть следующим образом:
project-directory
┣ docker-entrypoint-initdb.d
┃ ┗ mongo-init.js
┗ docker-compose.yaml
Проверьте наличие журналов, если вы столкнулись с какими-либо ошибками.