MongoDB и Docker через docker-compose ошибку аутентификации и без инициализации db - PullRequest
0 голосов
/ 03 марта 2019

Я новичок в Docker, и я прочитал Mongo Docker Docs .Мне нужна помощь в настройке простого приложения.

Мне нужен локальный mongodb, который создает дамп / использует базу данных с именем "my_test_db" и записывает в <project-dir>/mongo/my_test_db

Вот мой простой проект:

# project structure
<project-dir>/
-- .env
-- docker-compose.yml
-- mongo/
-- + -- my_test_db/

Файл .env:

# <project>/.env
MONGO_INITDB_ROOT_USERNAME=test_user
MONGO_INITDB_ROOT_PASSWORD=test_pwrd
MONGO_INITDB_DATABASE=my_test_db
MONGO_DATA_DIR=/mongo/my_test_db
MONGO_LOG_FILE=/mongo/mongodb.log

моя попытка docker compose:

#docker-compose.yml

version: '3'
services:
  mongodb:
    image: mongo:4.0

    # load env variables
    env_file:
      - .env 

    # map data_dir to host <project>/<data_dir>
    volumes:
      - ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}"

    expose:
      - 27017

    # set env vars with loaded vars (appears to be necessary for the user to be created, despite loading them with env_file)
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_DATABASE}
      MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}

    # map ports
    ports:
        - 27017:27017
    command: "mongod --smallfiles"
    container_name: mongodb-test
# --logpath=.${MONGO_LOG_FILE} # when added to command fails

тогда в двух оболочках у меня

#shell-1
<project-dir>$ docker-compose up

# I see my user created
# I see "MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=e19ea190b601" so my custom db isnt made on init...
#shell-2
# <project-dir>$ mongo 27017 --usernamne test_user --password test_pwrd # does fails to connect
<project-dir>$ mongo 27017 # connects



> db.getName()
# 27017 # so naming it didnt work

> show users
# Error: command usersInfo requires authentication

> use my_test_db
> db.myColl.insert({'name': 'test'})
# WriteCommandError({..., "codeName": "Unauthorized"})


В настоящее время я тестирую на macOS (поскольку в документах указано, что это может иметь значение)

Что я делаю не так?Я понимаю концепцию докера, но лично я не использую ее, потому что привыкнуть к ней слишком сложно ... но я пытаюсь учиться.

1 Ответ

0 голосов
/ 03 марта 2019
  • Для части аутентификации: вы пытались добавить --authenticationDatabase admin, чтобы иметь возможность войти в систему?
  • Относительно MONGO_INITDB_DATABASE это будет неэффективно, если у вас нет сценария под/docker-entrypoint-initdb.d/, как показано в docker-entrypoiny.sh , который используется в образе mongodb, так что вы можете иметь bash-скрипт в docker-entrypoint-initdb.d/ с указанным.

  • Использование пользователя root в качестве владельца вашего db не является безопасным, так как он будет иметь возможность контролировать все в экземпляре mongodb.

    ИМХО, лучший подход - добавить дополнительные переменные, как показано ниже::

    • MONGO_APPLICATION_DATABASE
    • MONGO_APPLICATION_USERNAME
    • MONGO_APPLICATION_PASSWORD

    Затем добавьте скрипт bash, который создаст пользователяи назначьте его базе данных, используя переменные окружения (вам нужно смонтировать его в docker-entrypoint-initdb.d):

    Возможно, вам потребуется изменить роль пользователя по своему усмотрению.

    # initmongo/setup.sh
    mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --eval "db.getSiblingDB('$MONGO_APPLICATION_DATABASE').createUser({user: '$MONGO_APPLICATION_USERNAME', pwd: '$MONGO_APPLICATION_PASSWORD', roles: [{role: 'readWrite', db: '$MONGO_APPLICATION_DATABASE'}]});"
    

    В docker-compose.yml добавьте том к вашему current список томов

    #docker-compose.yml
    volumes:
      - ".${MONGO_DATA_DIR}:${MONGO_DATA_DIR}"
      - "./initmongo/:/docker-entrypoint-initdb.d/"
    

    И, наконец, удалите эту переменную MONGO_INITDB_DATABASE, так как в ней нет необходимости

    Для входа используйте следующую команду:

    замените переменные фактическими значениями

    docker exec -it container_name mongo -u "$MONGO_APPLICATION_USERNAME" -p "$MONGO_APPLICATION_PASSWORD" --authenticationDatabase "$MONGO_APPLICATION_DATABASE" "$MONGO_APPLICATION_DATABASE"
    
  • Для файла .env я не уверен, что может вызвать эту проблему.есть ли у вас какие-либо предупреждения при его использовании?Также рассмотрите возможность проверки этого комментария или этого

...