कैसे शुरू पर MongoDB कंटेनर के लिए एक DB बनाने के लिए?


87

मैं डॉकर के साथ काम कर रहा हूं और मेरे पास PHP, MySQL, Apache और Redis के साथ एक स्टैक है। मुझे अब MongoDB जोड़ने की आवश्यकता है इसलिए मैं नवीनतम संस्करण के लिए Dockerfile की जाँच कर रहा था और MongoDB Dockerhub से docker-entrypoint.sh फ़ाइल भी देख रहा था, लेकिन मुझे डिफ़ॉल्ट DB, व्यवस्थापक उपयोगकर्ता / पासवर्ड और संभवत: सेटअप करने का कोई तरीका नहीं मिला एक फ़ाइल से कंटेनर के लिए विधि ।docker-compose.yml

MySQL में आप उदाहरण के लिए कुछ ईएनवी वैरिएबल सेटअप कर सकते हैं:

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}

और यह DB और उपयोगकर्ता / पासवर्ड को पासवर्ड के रूप में सेटअप करेगा root

क्या MongoDB के साथ भी इसे हासिल करने का कोई तरीका है? किसी को कुछ अनुभव या समाधान है?


क्या आप mysql पर आधारित कंटेनर बना सकते हैं और इसे सेट कर सकते हैं जैसा आप चाहते हैं और फिर इसका उपयोग करें?
वैलेंटाइन

@ वैलेन्टिन बेशक मैं कर सकता हूं लेकिन आपकी बात क्या है?
२०:४३ पर रेनियरपाम

मेरा कहना है, कि आप डिफॉल्ट रूप से डीबी, एडमिन यूजर / पासवर्ड और ड्यूरेफाइल में वेरिएबल्स का उपयोग करके और फिर उन्हें कंपोज फाइल में पास कर सकते हैं
वैलेंटाइन

नोट: यदि कोई भी समाधान जो मोंगो-इनिट स्क्रिप्ट का उपयोग करता है, तो कृपया यह सुनिश्चित करें कि आप पुनः आरंभ करें: जब तक कि (या कुछ के अलावा कुछ नहीं) मुंगो पर निर्भर कंटेनरों के लिए। ऐसा इसलिए है क्योंकि ये कंटेनर पहली बार मूंगो से जुड़ने में विफल होंगे, जबकि यह इनिशियलाइज़ करता है (यहां तक ​​कि डिपेंडेंट_ऑन फ्लैग के साथ भी)। जानकारी के लिए इस सूत्र को देखें stackoverflow.com/questions/31746182/…
java-addict301

जवाबों:


98

आधिकारिक mongoछवि है कार्यक्षमता शामिल करने के लिए एक जनसंपर्क विलय कर दिया स्टार्टअप पर उपयोगकर्ताओं और डेटाबेस बनाने के लिए।

डेटाबेस इनिशियलाइज़ेशन तब चलेगा जब /data/dbडायरेक्टरी में कुछ भी पॉप्युलेट न हो ।

व्यवस्थापक उपयोगकर्ता सेटअप

"रूट" उपयोगकर्ता सेटअप को नियंत्रित करने के लिए पर्यावरण चर हैं

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

उदाहरण

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

आपको --authकमांड लाइन पर उपयोग करने की आवश्यकता नहीं है / कर सकते हैं क्योंकि docker entrypoint.sh स्क्रिप्ट पर्यावरण चर मौजूद होने पर इसे जोड़ता है।

डेटाबेस प्रारंभिक

छवि /docker-entrypoint-initdb.d/कस्टम .jsया .shसेटअप स्क्रिप्ट को परिनियोजित करने के लिए पथ भी प्रदान करती है जो डेटाबेस इनिशियलाइज़ेशन पर एक बार चलाई जाएगी। .jsस्क्रिप्ट को testडिफ़ॉल्ट रूप से या MONGO_INITDB_DATABASEयदि वातावरण में परिभाषित किया गया है, तो चलाया जाएगा ।

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

या

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

एक साधारण आरंभीकरण मैंगो शेल जावास्क्रिप्ट फ़ाइल जो containerडेटा के साथ संग्रह को स्थापित करने , लॉगिंग और कैसे एक त्रुटि (परिणाम की जाँच के लिए) के साथ बाहर निकलने के लिए प्रदर्शित करता है।

let error = true

let res = [
  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' }),
  db.other.
]

printjson(res)

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

यह उत्कृष्ट है, मुझे लगता set -eहै कि परिभाषा entrypoint.shसे चर पढ़ने के लिए कह ENVरहा हूं इसलिए मैं MySQL से उदाहरण के रूप में उसी दृष्टिकोण का उपयोग कर सकता हूं, मैं सही हूं? आपके उत्तर के अतिरिक्त मुझे यह पीआर मिला जहां जाहिरा तौर पर कोई व्यक्ति आपके प्रस्ताव के समान काम कर रहा है, बस दूसरे दृष्टिकोण से आ रहा है
रेनियरपीएम

पर्यावरण चर आप डिफ़ॉल्ट रूप से प्राप्त करते हैं। set -eजब कोई आदेश विफल होता है, तो पूरी स्क्रिप्ट बाहर निकल जाती है, इसलिए स्क्रिप्ट चुपचाप विफल नहीं हो सकती और स्टार्टअप मोंगो।
मैट

सभी Dockerfile की समान स्क्रिप्टों का निर्माण करें जिन्हें आप &&हर जगह उपयोग करते देखते हैं ।
मैट

यह मानगो पीआर एक अधिक गहन कार्यान्वयन है! और docker-entrypoint-initdb.dनिर्देशिका इसे एक्स्टेंसिबल बनाती है। मुझे आशा है कि विलय हो जाएगा
मैट

इसका विलय ( यहां देखें )
रेनियरपाम

99

यहां एक और क्लीनर समाधान का उपयोग करके docker-composeऔर एक jsस्क्रिप्ट।

यह उदाहरण मानता है कि दोनों फ़ाइलें (docker-compose.yml और mongo-init.js) एक ही फ़ोल्डर में हैं।

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>"
                }
            ]
        }
);

फिर बस निम्नलिखित डॉक-कम्पोज़ कमांड चलाकर सेवा शुरू करें

docker-compose up --build -d mongodb 

नोट : डॉकटर-एंट्रीपॉइंट-init.d फ़ोल्डर में कोड केवल तभी निष्पादित किया जाता है जब डेटाबेस को पहले कभी इनिशियलाइज़ नहीं किया गया हो।


आपको अपनी सेटिंग्स में स्निपेट में सभी <> मानों को बदलना होगा।
पॉल वासिल्वेस्की

6
mongo-init.js क्या है: ro?
हेरिल मुराटोविक

11
@HerilMuratovic, volumesप्रविष्टि ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:roस्थानीय फाइल लिंक हो रहा है ./mongo-init.jsकंटेनर पथ के लिए /docker-entrypoint-initdb.d/mongo-init.jsके रूप में रीड-ओनली ro। आप यहाँ वॉल्यूम का उपयोग करने के तरीके के बारे में अधिक जानकारी प्राप्त कर सकते हैं : docs.docker.com/storage/volumes
पॉल

2
@GustavoSilva मुझे पूरा यकीन है कि यह काम कर रहा है। ऐसा लगता है कि आपका डॉकटर फ़ाइल बनाता है और जेएस स्क्रिप्ट एक ही फ़ोल्डर में नहीं है। या आप खिड़कियों पर काम कर रहे हैं? फिर कृपया volumesविकल्प को समायोजित करें और mongo-init.jsउदाहरण के लिए फ़ाइल में पूर्ण पथ जोड़ें c:\docker\mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
पॉल वासिल्वस्की

1
Db क्या है? कोड मेरे लिए अधूरा लगता है, यह है कि मोंगोज़ कनेक्शन?
andrevenancio

55

यहां एक कार्यशील समाधान है जो admin-userउपयोगकर्ता को एक पासवर्ड, अतिरिक्त डेटाबेस ( test-database), और test-userउस डेटाबेस में बनाता है ।

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/

मोंगो-इनिट.जेएस:

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

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

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

मुश्किल हिस्सा यह समझने के लिए था कि * .js फाइलें बिना लाइसेंस के चलाई गई थीं। समाधान डेटाबेस admin-userमें स्क्रिप्ट को प्रमाणित करता है adminMONGO_INITDB_DATABASE adminआवश्यक है, अन्यथा testdb के विरुद्ध स्क्रिप्ट निष्पादित की जाएगी । Docker-entrypoint.sh के स्रोत कोड की जाँच करें


1
क्या भूमिकाओं में एक टाइपो है? db टेस्ट-डेटाबेस होना चाहिए?
विंस्टर

दूसरी लाइन पर दो टिप्पणियाँ जिनमें GetSiblingDB है। सबसे पहले, इस लाइन के बिना मेरे परीक्षण में सब कुछ काम किया। दूसरा, यह डीबी चर को इस तरह से अधिलेखित करने के लिए खराब रूप की तरह लगता है, क्योंकि यह एक वैश्विक वस्तु माना जाता है और इसे अधिलेखित करने से यह सब कुछ के लिए संदर्भ बदल जाता है।
लेज़र

50

UPD टुडे मैं डॉकर झुंड, रहस्य और विन्यास से बचता हूं । मैं इसे docker-composeऔर .envफ़ाइल के साथ चलाऊंगा। जब तक मुझे ऑटोसालिंग की जरूरत नहीं है। अगर मैं करता हूं, तो मैं शायद k8s चुनूंगा। और डेटाबेस पासवर्ड, रूट खाता या नहीं ... क्या वे वास्तव में मायने रखते हैं जब आप कंटेनर में एक एकल डेटाबेस चला रहे हैं जो बाहरी दुनिया से जुड़ा नहीं है? .. मैं जानना चाहूंगा कि आप इसके बारे में क्या सोचते हैं, लेकिन स्टैक ओवरफ्लो शायद इस तरह के संचार के लिए अच्छी तरह से अनुकूल नहीं है।

मानगो छवि MONGO_INITDB_DATABASE परिवर्तनशील से प्रभावित हो सकती है , लेकिन यह डेटाबेस नहीं बनाएगी। /docker-entrypoint-initdb.d/* स्क्रिप्ट को चलाते समय यह चर वर्तमान डेटाबेस को निर्धारित करता है । चूंकि आप मोंगो द्वारा निष्पादित स्क्रिप्ट में पर्यावरण चर का उपयोग नहीं कर सकते हैं , मैं एक शेल स्क्रिप्ट के साथ गया:

docker-swarm.yml:

version: '3.1'

secrets:
  mongo-root-passwd:
    file: mongo-root-passwd
  mongo-user-passwd:
    file: mongo-user-passwd

services:
  mongo:
    image: mongo:3.2
    environment:
      MONGO_INITDB_ROOT_USERNAME: $MONGO_ROOT_USER
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongo-root-passwd
      MONGO_INITDB_USERNAME: $MONGO_USER
      MONGO_INITDB_PASSWORD_FILE: /run/secrets/mongo-user-passwd
      MONGO_INITDB_DATABASE: $MONGO_DB
    volumes:
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh
    secrets:
      - mongo-root-passwd
      - mongo-user-passwd

init-mongo.sh:

mongo -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
    var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = '$MONGO_INITDB_USERNAME';
    var passwd = '$(cat "$MONGO_INITDB_PASSWORD_FILE")';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

वैकल्पिक रूप से, आप init-mongo.shकॉन्फ़िगर में स्टोर कर सकते हैं ( docker config create) और इसके साथ माउंट करें:

configs:
    init-mongo.sh:
        external: true
...
services:
    mongo:
        ...
        configs:
            - source: init-mongo.sh
              target: /docker-entrypoint-initdb.d/init-mongo.sh

और रहस्यों को एक फ़ाइल में संग्रहीत नहीं किया जा सकता है।

बात पर एक- दूसरे की खिंचाई करता है।


11
मैंने शुरू में अपनी स्वयं की डीबी बनाने के तरीके की खोज करने के लिए लगभग 3 घंटे का समय बिताया। पागल कि प्रलेखन का उल्लेख नहीं है कि आपको .js या .sh फ़ाइलों के भीतर प्रमाणित करने की आवश्यकता है। इंटरनेट पर उदाहरण बिल्कुल नहीं हैं। आपको वास्तव में उनकी .sh लिपि में खुदाई करने की आवश्यकता है ताकि यह समझा जा सके कि यह सामान कैसे लिखना है। कंटेनर शुरू होने पर "खाली डेटाबेस कैसे बनाएं"। इसके सरलीकरण के लिए पीआर बनाया जाना चाहिए। मुझसे पूछें तो थोड़ा सा पागल।
कूल

1
मैंने इस समस्या के समाधान की तलाश में घंटों बिताए। इसने मुझे बचा लिया। धन्यवाद।
नैयाप्रोग्रामर

$(cat "$MONGO_INITDB_ROOT_PASSWORD_FILE")$MONGO_INITDB_ROOT_PASSWORDइन दिनों के साथ प्रतिस्थापित किया जाना चाहिए क्योंकि मानगो छवि पहले से ही हमारे लिए रहस्य संभालती है। hub.docker.com/_/mongo
FlippingBinary

ऐसा 3.2 में भी हुआ था। मैं शायद नोटिस करने में विफल रहा।
x-yuri

@ x-yuri init-mongo.sh के लिए कॉन्फिगरेशन का उपयोग करने का क्या फायदा है, बजाय इसके कि आप फाइल को डॉकटर-एंट्रीपॉइंट-इनडीड.बीडी में कॉपी करें और इसे अपने आप चलने दें?
लेज़र

13

यदि कोई व्यक्ति प्रमाणीकरण का उपयोग करके MongoDB को कॉन्फ़िगर करने के तरीके की तलाश कर रहा है docker-compose, तो यहां पर्यावरण चर का उपयोग करके एक नमूना कॉन्फ़िगरेशन है:

version: "3.3"

services:

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

जब docker-compose upआपके मोंगो इंस्टेंस को चलाया जाता है, तो स्वचालित रूप से ऑर्गेनिक इनेबल्ड के साथ चलाया जाता है। आपके पास दिए गए पासवर्ड के साथ एक व्यवस्थापक डेटाबेस होगा।


3
mongo --username admin --password password --host localhost --port 27017मैं कनेक्ट नहीं कर पा रहा हूं क्योंकि लॉग उपयोगकर्ताओं को दिखाते हैं और डीबी सफलतापूर्वक बनाया जाता है। त्रुटि:$ mongo --username admin --password password --host localhost --port 27017 MongoDB shell version v3.4.10 connecting to: mongodb://localhost:27017/ MongoDB server version: 3.6.5 WARNING: shell and server versions do not match 2018-06-07T13:05:09.022+0000 E QUERY [thread1] Error: Authentication failed. : DB.prototype._authOrThrow@src/mongo/shell/db.js:1461:20 @(auth):6:1 @(auth):1:2 exception: login failed
तारा प्रसाद गुरुंग

1
आपको mongo admin --username ADMIN --password PASSWORTअपने मोंगो उदाहरण से कनेक्ट करने की आवश्यकता है ।
फिलिप स्कील

1
यह काम करने के लिए नहीं मिल सकता है। "उपयोगकर्ता व्यवस्थापक @ व्यवस्थापक नहीं मिला"। यह स्वचालित रूप से उपयोगकर्ता बनाने के लिए प्रतीत नहीं होता है?
बैटजोको

mongodb://root:example@localhost/my-db?authSource=admin
एफडिस्क

@TaraPrasadGurung मुझे यह समस्या थी, मैंने देखा कि मेरे पास पहले से ही डेटाबेस के लिए एक वॉल्यूम था, आपको एक नया उपयोगकर्ता बनाने के लिए कंटेनर के लिए इस वॉल्यूम को हटाना होगा।
डैनियल एस।

5

यदि आप अपने docker-compose.yml से उपयोगकर्ता नाम और पासवर्ड निकालना चाहते हैं, तो आप डॉकर राज का उपयोग कर सकते हैं , यहां बताया गया है कि मैंने इसे कैसे संपर्क किया है।

version: '3.6'

services:
  db:
    image: mongo:3
    container_name: mycontainer
  secrets:
    - MONGO_INITDB_ROOT_USERNAME
    - MONGO_INITDB_ROOT_PASSWORD
  environment:
    - MONGO_INITDB_ROOT_USERNAME_FILE=/var/run/secrets/MONGO_INITDB_ROOT_USERNAME
    - MONGO_INITDB_ROOT_PASSWORD_FILE=/var/run/secrets/MONGO_INITDB_ROOT_PASSWORD
secrets:
  MONGO_INITDB_ROOT_USERNAME:
    file:  secrets/${NODE_ENV}_mongo_root_username.txt
  MONGO_INITDB_ROOT_PASSWORD:
    file:  secrets/${NODE_ENV}_mongo_root_password.txt

मेरे पास फ़ाइल का उपयोग होता है: मेरे रहस्यों के लिए विकल्प, हालांकि, आप बाहरी का भी उपयोग कर सकते हैं : और एक झुंड में रहस्यों का उपयोग करें।

रहस्य कंटेनर में किसी भी स्क्रिप्ट के लिए उपलब्ध हैं / var / रन / रहस्य

डॉक्यूमेंट डॉक्यूमेंटेशन में संवेदनशील डेटा को स्टोर करने के बारे में कहा गया है ...

https://docs.docker.com/engine/swarm/secrets/

आप किसी भी संवेदनशील डेटा को प्रबंधित करने के लिए रहस्यों का उपयोग कर सकते हैं, जिसे एक कंटेनर को रनटाइम की आवश्यकता होती है, लेकिन आप छवि या स्रोत नियंत्रण में संग्रहीत नहीं करना चाहते हैं, जैसे:

उपयोगकर्ता नाम और पासवर्ड टीएलएस प्रमाणपत्र और कुंजी एसएसएच कुंजी अन्य महत्वपूर्ण डेटा जैसे कि डेटाबेस या आंतरिक सर्वर का नाम जेनेरिक स्ट्रिंग्स या बाइनरी सामग्री (आकार में 500 केबी तक)


4

इस .envफाइल को दिया:

DB_NAME=foo
DB_USER=bar
DB_PASSWORD=baz

और यह mongo-init.shफाइल:

mongo --eval "db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD'); db = db.getSiblingDB('$DB_NAME'); db.createUser({ user: '$DB_USER', pwd: '$DB_PASSWORD', roles: [{ role: 'readWrite', db: '$DB_NAME' }] });"

यह docker-compose.ymlव्यवस्थापक डेटाबेस और व्यवस्थापक उपयोगकर्ता बनाएगा, व्यवस्थापक उपयोगकर्ता के रूप में प्रमाणित करेगा, फिर वास्तविक डेटाबेस बनाएँ और वास्तविक उपयोगकर्ता जोड़ें:

version: '3'

services:
#  app:
#    build: .
#    env_file: .env
#    environment:
#      DB_HOST: 'mongodb://mongodb'

  mongodb:
    image: mongo:4
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin-user
      MONGO_INITDB_ROOT_PASSWORD: admin-password
      DB_NAME: $DB_NAME
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
    ports:
      - 27017:27017
    volumes:
      - db-data:/data/db
      - ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh

volumes:
  db-data:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.