92 votes

Comment créer une base de données pour le conteneur MongoDB au démarrage ?

Je travaille avec Docker et j'ai une pile avec PHP, MySQL, Apache et Redis. Je dois ajouter MongoDB maintenant, donc je vérifiais le Dockerfile pour la dernière version et aussi le docker-point d'entrée.sh du dossier de la Dockerhub MongoDB mais je n'ai pas trouvé le moyen de configurer une base de données par défaut, un utilisateur/mot de passe administrateur et éventuellement une méthode d'authentification pour le conteneur à partir d'un docker-compose.yml de l'entreprise.

Dans MySQL, vous pouvez configurer certaines variables ENV comme par exemple :

db:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

Et cela permettra de configurer la base de données et l'utilisateur/mot de passe comme root mot de passe.

Y a-t-il un moyen d'obtenir la même chose avec MongoDB ? Quelqu'un a de l'expérience ou une solution de contournement ?

105voto

Matt Points 25814

Le officiel mongo image a a fusionné un RP pour inclure la fonctionnalité pour créer des utilisateurs et des bases de données au démarrage.

L'initialisation de la base de données s'effectuera lorsqu'il n'y aura rien dans la /data/db répertoire.

Configuration de l'utilisateur Admin

Les variables d'environnement permettant de contrôler la configuration de l'utilisateur "racine" sont

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

Exemple

docker run -d \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  mongod

Vous n'avez pas besoin/ne pouvez pas utiliser --auth sur la ligne de commande comme point d'entrée du docker.sh script ajoute ceci lorsque les variables d'environnement existent.

Autre initialisation personnalisée

L'image fournit également la /docker-entrypoint-initdb.d/ cheminement pour déployer des .js ou .sh des scripts de configuration qui seront exécutés une fois lors de l'initialisation de la base de données. .js Les scripts seront présentés contre test par défaut ou MONGO_INITDB_DATABASE si elle est définie dans l'environnement.

COPY mysetup.sh /docker-entrypoint-initdb.d/

ou

COPY mysetup.js /docker-entrypoint-initdb.d/

Un simple fichier javascript d'initialisation qui démontre l'enregistrement et comment sortir avec une erreur (pour la vérification des résultats).

let error = true

let res = [
  db.container.drop(),
  db.container.drop(),
  db.container.createIndex({ myfield: 1 }, { unique: true }),
  db.container.createIndex({ thatfield: 1 }),
  db.container.createIndex({ thatfield: 1 }),
  db.container.insert({ myfield: 'hello', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello2', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello3', thatfield: 'testing' }),
  db.container.insert({ myfield: 'hello3', thatfield: 'testing' }),
]

printjson(res)

if (error) {
  print('Error, exiting')
  quit(1)
}

103voto

Andi Points 195

Voici une autre solution plus propre en utilisant docker-compose et un js script.

Cet exemple suppose que les deux fichiers (docker-compose.yml et mongo-init.js) se trouvent dans le même dossier.

docker-compose.yml

version: '3.7'

services:
    mongodb:
        image: mongo:latest
        container_name: mongodb
        restart: always
        environment:
            MONGO_INITDB_ROOT_USERNAME: <admin-user>
            MONGO_INITDB_ROOT_PASSWORD: <admin-password>
            MONGO_INITDB_DATABASE: <database to create>
        ports:
            - 27017:27017
        volumes:
            - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro

mongo-init.js

db.createUser(
        {
            user: "<user for database which shall be created>",
            pwd: "<password of user>",
            roles: [
                {
                    role: "readWrite",
                    db: "<database to create>"
                }
            ]
        }
);

Il suffit ensuite de lancer le service en exécutant la commande docker-compose suivante

docker-compose up --build -d mongodb

55voto

Mateusz Stefek Points 762

Voici une solution de travail qui crée admin-user utilisateur avec un mot de passe, base de données supplémentaire ( test-db ), et test-user dans cette base de données.

Dockerfile :

FROM mongo:4.0.3

ENV MONGO_INITDB_ROOT_USERNAME admin-user
ENV MONGO_INITDB_ROOT_PASSWORD admin-password
ENV MONGO_INITDB_DATABASE admin

ADD mongo-init.js /docker-entrypoint-initdb.d/

mongo-init.js :

db.auth('admin-user', 'admin-password')

db = db.getSiblingDB('test-database')

db.createUser({
  user: 'test-user',
  pwd: 'test-password',
  roles: [
    {
      role: 'root',
      db: 'admin',
    },
  ],
});

La partie délicate était de comprendre que les fichiers *.js étaient exécutés sans authentification. La solution consiste à authentifier le script comme étant le admin-user dans la admin base de données. MONGO_INITDB_DATABASE admin est essentiel, sinon le script serait exécuté contre la test db. Vérifiez le code source de docker-point d'entrée.sh .

53voto

x-yuri Points 616

L'image de Mongo peut être affectée par MONGO_INITDB_DATABASE variable mais il ne créera pas la base de données. Cette variable détermine la base de données actuelle lors de l'exécution de /docker-entrypoint-initdb.d/* scripts . Puisque vous ne peut pas utiliser des variables d'environnement dans les scripts exécutés par Mongo, je suis allé avec un shell script :

docker-cloud.yml :

version: '3.1'

secrets:
  mongo-passwd:
    file: mongo-passwd

services:
  mongo:
    image: mongo:3.2
    environment:
      MONGO_DB: ${MONGO_DB}
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-passwd
    volumes:
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
    secrets:
      - mongo-passwd

init-mongo.sh :

mongo -- "$MONGO_DB" <<EOF
var user = '$MONGO_INITDB_ROOT_USERNAME';
var passwd = '$MONGO_INITDB_ROOT_PASSWORD';
var admin = db.getSiblingDB('admin');
admin.auth(user, passwd);
db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

14voto

user2350644 Points 642

Au cas où quelqu'un chercherait comment configurer MongoDB avec une authentification utilisant docker-compose Voici un exemple de configuration utilisant des variables d'environnement :

version: "3.3"

services:

  db:
      image: mongo
      environment:
        - MONGO_INITDB_ROOT_USERNAME=admin
        - MONGO_INITDB_ROOT_PASSWORD=<YOUR_PASSWORD>
      ports:
        - "27017:27017"

En cours d'exécution docker-compose up votre instance mongo est exécutée automatiquement avec l'autorisation activée. Vous aurez une base de données admin avec le mot de passe donné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X