аутентифицировать пользователя в mon go db на docker - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь использовать docker в моем существующем проекте. У меня есть два дополнительных сервиса: redis и mongodb. У меня возникла проблема с созданием пользователя и аутентификацией этого пользователя для использования базы данных. Я не хочу запускать контейнер (docker exe c -it ...) и создавать пользователя и предоставлять там разрешение. Таким образом, каждый разработчик должен делать это на своей машине. Вместо этого я хочу иметь скрипт, который запускается при создании образа mongodb.

Вот как я пытаюсь

const {
  DATABASE_HOST,
  DATABASE_PORT,
  DATABASE_DBNAME,
  DATABASE_DBUSER,
  DATABASE_DBPASS,
} = require('../configs');

console.log('DATABASE', DATABASE_HOST);

db.createUser({
  user: DATABASE_DBUSER,
  pwd: DATABASE_DBPASS,
  roles: [
    {
      role: 'readWrite',
      db: DATABASE_DBNAME,
    },
  ],
});

docker -compose.yml

version: "3.7"

# Lets define all our services (i.e. our containers to run)
services:
    # create a mongodb database
    travel-db:
        image: mongo
        container_name: "travel-db"
        env_file:
            - ./.env
        volumes:
            - ./src/helpers/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
            - "mongodb:/data/db/"
        # opening mongodb port so that it can be connected from host
        ports:
            - "27017:27017"
    # create redis-server
    travel-redis-server:
        image: redis:latest
        container_name: "travel-redis-server"
        env_file:
            - ./.env
        volumes:
            - redis:/data/
        ports:
            - "6379:6379"

    # express app
    travel-express-server:
        image: "travel-express-server"
        container_name: "travel-express-server"
        env_file:
            - ./.env
        volumes:
            - .:/usr/src/app
        ports:
            - "8000:8000"

volumes:
    mongodb: {}
    redis: {}

Я получаю следующую ошибку:

enter image description here

ОБНОВЛЕНИЕ

Я изменил mon go -init. js на

db.createUser({
  user: 'traveluser',
  pwd: 'travel123',
  roles: [
    {
      role: 'readWrite',
      db: 'travel_db',
    },
  ],
});

он затем говорит следующее

Successfully added user: {
travel-db                |   "user" : "traveluser",
travel-db                |   "roles" : [
travel-db                |           {
travel-db                |                   "role" : "readWrite",
travel-db                |                   "db" : "travel_db"
travel-db                |           }
travel-db                |   ]
travel-db                | }

, но все еще получает ошибку при аутентификации

SASL SCRAM-SHA-1 authentication failed for traveluser on travel_db from client 172.20.0.4:36562 ; UserNotFound: Could not find user "traveluser" for db "travel_db"

, если я использую

environment:
   - MONGO_INITDB_ROOT_USERNAME=admin
   - MONGO_INITDB_ROOT_PASSWORD=pass

, а затем прокомментируйте следующий - ./src/helpers/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro и измените переменную env с правами администратора, тогда он будет работать, но не иначе, как admin.

1 Ответ

1 голос
/ 06 мая 2020

require не является функцией оболочки mon go. Если вам нужно прочитать код javascript из файла, используйте функцию load.

Пользователь, вероятно, создается не в той базе данных. Вы можете явно указать, какую базу данных при создании:

db.getSiblingDB("travel_db").createUser({
  user: 'traveluser',
  pwd: 'travel123',
  roles: [
    {
      role: 'readWrite',
      db: 'travel_db',
    },
  ],
})
...