मैं docker-compose.yml फ़ाइल में पर्यावरण चर का उपयोग करके एक MySQL डेटाबेस बनाना चाहता हूं, लेकिन यह काम नहीं कर रहा है। मेरे पास निम्न कोड है:

# The Database
database:
  image: mysql:5.7
  volumes:
    - dbdata:/var/lib/mysql
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: homestead
    MYSQL_USER: root
    MYSQL_PASSWORD: secret
  ports:
    - "33061:3306"

क्या कोई इस vars के कार्य की व्याख्या कर सकता है?

70
Pedrog 10 अप्रैल 2017, 14:30

6 जवाब

mysql कंटेनर के लिए एक init फ़ाइल प्रदान करने का एक विकल्प भी है जो हर बार कंटेनर बनने पर लागू किया जाएगा।

database:
    image: mysql:5.7
    ports:
        - "33061:3306"
    command: --init-file /data/application/init.sql
    volumes:
        - ./init.sql:/data/application/init.sql
    environment:
        MYSQL_ROOT_USER: root
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: homestead
        MYSQL_USER: root
        MYSQL_PASSWORD: secret

ऐसी फ़ाइल (init.sql) में आपकी प्रारंभिक डेटाबेस संरचना और डेटा हो सकता है - उदाहरण के लिए:

CREATE DATABASE IF NOT EXISTS dev;
CREATE DATABASE IF NOT EXISTS test;
USE dev;
CREATE TABLE IF NOT EXISTS (...);
55
vlio20 9 नवम्बर 2019, 00:03
/data/application/init.sql यह फ़ाइल होस्ट मशीन में स्थित होनी चाहिए? या MySQL कंटेनर के अंदर?
 – 
Madhan Ayyasamy
31 जिंदा 2019, 18:52
अद्यतन उत्तर देखें। चूंकि /data/application/init.sql MySQL के लिए एक तर्क है जो कंटेनर में चलता है, पथ को "आंतरिक" भी होना चाहिए। बाइंड माउंटेड होने से फाइल वहां पहुंच सकती है।
 – 
marszczybrew
31 जिंदा 2019, 21:17
1
क्या मैं एकाधिक एसक्यूएल फाइल चला सकता हूं?
 – 
Hamzawey
26 मार्च 2019, 23:25
1
इसके परिणामस्वरूप कंटेनर पर एक निर्देशिका होगी, जिसे /data/application/init.sql कहा जाता है, जब तक फ़ाइल कंटेनर पर पहले से मौजूद नहीं है। कंटेनर में फ़ाइल के रूप में प्रदर्शित होने के लिए होस्ट फ़ाइल को माउंट करने के बारे में बाइंड माउंट के बारे में डॉकर डॉक्स
 – 
kaicarno
30 मई 2019, 01:18
1
docker-compose.yml के अंदर वॉल्यूम पथ उस फ़ाइल के सापेक्ष हैं, इसलिए यदि यह रूट प्रोजेक्ट निर्देशिका में है और हमारे माउंट में ./init.sql:/data/application/init.sql है तो init.sql फ़ाइल को रूट निर्देशिका में भी होना चाहिए
 – 
marszczybrew
4 जुलाई 2019, 09:25

डेटाबेस शायद पहले से ही आरंभिक है और कॉन्फ़िगरेशन /var/lib/mysql में संग्रहीत है। चूंकि आपने उस स्थान के लिए वॉल्यूम परिभाषित किया है, इसलिए कॉन्फ़िगरेशन पुनरारंभ होने से बच जाएगा। MySQL छवि डेटाबेस को बार-बार पुन: कॉन्फ़िगर नहीं करेगी, यह केवल एक बार ऐसा करती है।

volumes: - dbdata:/var/lib/mysql

यदि आपका डेटाबेस खाली है तो आप docker-compose down -v प्रदर्शन करके डेटाबेस को रीसेट कर सकते हैं जहां -v वॉल्यूम सेक्शन में परिभाषित वॉल्यूम को हटा देता है। देखें https://docs.docker.com/compose/reference/down/। अगले docker-compose up पर MySQL इमेज नए सिरे से शुरू होगी और पर्यावरण अनुभाग के माध्यम से आपके द्वारा प्रदान किए गए कॉन्फ़िगरेशन के साथ डेटाबेस को इनिशियलाइज़ करेगी।

25
Sebastiaan Renkens 10 अप्रैल 2017, 16:26
अरे हां! बहुत-बहुत धन्यवाद, ऐसा इसलिए होना चाहिए क्योंकि अब इसे env से मान मिल रहे हैं। युद्ध
 – 
Pedrog
10 अप्रैल 2017, 19:59
महोदय आपका बहुत बहुत धन्यवाद! मैं अपने डेटाबेस sql gz फ़ाइल को स्वचालित रूप से आयात नहीं कर सका क्योंकि वॉल्यूम पहली बार इसके बिना पहले से ही बनाया गया था। -v तर्क ने इसे ठीक कर दिया।
 – 
coder_1432
11 मई 2018, 21:14
ओह मेरे दिन यह बहुत उपयोगी था। मैंने पूरे कार्य दिवस का सबसे अच्छा हिस्सा यह पता लगाने की कोशिश में बिताया कि डॉकर अप डीबी क्यों नहीं बना रहा था। (इसे हटा दिया गया था)। इसने इसे ठीक कर दिया। आश्चर्यजनक रूप से docker stop $(docker ps -a -q), docker rm $(docker ps -a -q) और docker rmi $(docker images -q) करने से इसका समाधान नहीं हुआ। मैंने सोचा होगा कि सब कुछ काम कर गया होगा।
 – 
simonw16
18 जिंदा 2019, 02:03

आपके प्रश्न का उत्तर...

एक नया डॉकटर कंटेनर बनाते समय मैं एक चीज का उपयोग करता हूं, यह समझ में आता है कि मैं जिस छवि से खींचता हूं वह निर्माण के दौरान क्या करती है।

आपके docker-compose.yml में आपके पास यह है

# The Database
database:
  image: mysql:5.7

यह वह छवि है जिसे आप "mysql: 5.7" से खींचते हैं

डॉकरहब एक भंडार है जहां आप इस छवियों की जानकारी पा सकते हैं।

एक Google खोज करें "mysql: 5.7 dockerhub"

पहला परिणाम है https://hub.docker.com/_/mysql/

वहां आपकी छवि 5.7 है, यदि आप 5.7 पर क्लिक करते हैं तो आपके पास यह है

https://github.com/docker-library/mysql/blob/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7/Dockerfile

छवि से Dockerfile कौन सा है, आप छवि बनाते समय होने वाली दिलचस्प चीजों पर एक नज़र डाल सकते हैं।

इनमें से एक है ENTRYPOINT ["docker-entrypoint.sh"]

यह वह फ़ाइल है जिसे छवि तैयार होने पर निष्पादित किया गया है

मैं आप रेपो में एक स्तर ऊपर जाते हैं आपको यह फाइल दिखाई देगी

https://github.com/docker-library/mysql/tree/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7

आप देख सकते हैं कि आपके पर्यावरण चर नए डेटाबेस आदि बनाने के लिए उपयोग किए जा रहे हैं ...

file_env 'MYSQL_DATABASE'
        if [ "$MYSQL_DATABASE" ]; then
            echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
            mysql+=( "$MYSQL_DATABASE" )
fi
15
jonhid 26 फरवरी 2018, 08:31

Docker-compose के संस्करण 2 के लिए आप .yml या .yaml इस तरह दिख सकते हैं:

version: '2'
volumes:
 dbdata:

services:
 mysql:
  image: mysql:5.7
  container_name: mysql
  volumes:
    - dbdata:/var/lib/mysql
  restart: always
  environment:
    - MYSQL_ROOT_PASSWORD=secret
    - MYSQL_DATABASE=homestead
    - MYSQL_USER=root
    - MYSQL_PASSWORD=secret
  ports:
    - "33061:3306"

इसे docker-compose up -d से शुरू करें और जाँच करें:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
a3567fb78d0d        mysql:5.7           "docker-entrypoint..."   2 minutes ago       Up 2 minutes        0.0.0.0:33061->3306/tcp   mysql

docker exec -it a3567fb78d0d bash
root@a3567fb78d0d:/# mysql -u root -p homestead
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| homestead          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

आपका वॉल्यूम डॉकर वॉल्यूम में बना रहेगा nameoffolder_dbdata (/var/lib/docker/volumes/...)

10
lvthillo 10 अप्रैल 2017, 16:48
यह बिल्कुल नहीं है कि मैं पूछ रहा हूँ लेकिन यह दिलचस्प है। मुझे आश्चर्य है कि क्या पर्यावरण के संस्करण भी डेटाबेस बनाने के लिए हैं। क्योंकि docker-compose.yml में डेटाबेस का नाम आता है, क्यों?
 – 
Pedrog
10 अप्रैल 2017, 15:29
1
मैं आपके उत्तर/प्रश्न को पूरी तरह समझ नहीं पा रहा हूं लेकिन हां, env var होमस्टेड नाम से एक डेटाबेस बना रहा है। जब मैं शो डेटाबेस करता हूं तो मेरे उत्तर की जांच करें। आप होमस्टेड डीबी देखते हैं, मैं भी उस डीबी (-पी) पर प्रमाणीकरण कर रहा हूं
 – 
lvthillo
10 अप्रैल 2017, 16:46
मेरे पास पहले से ही कंटेनर है। मैं कंटेनर के लिए डेटाबेस बनाना चाहता हूँ। क्या आप कृपया मुझे बता सकते हैं कि कंटेनर के लिए डॉकर-कंपोज़ फ़ाइल कैसे बनाएं?
 – 
fiza khan
22 पद 2017, 10:03
ऐसी छवि का उपयोग करें जिसमें कंटेनर में डेटाबेस हो जैसे mysql या postgres? यदि आप अपना स्वयं का डीबी स्थापित करना चाहते हैं तो आपको डॉकरफाइल लिखना होगा और छवि को डॉकर-कंपोज़ में बनाना होगा
 – 
lvthillo
22 पद 2017, 10:28

अगर मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप इसमें एक विशिष्ट डेटाबेस के साथ एक कंटेनर रखना चाहते हैं। जैसे CREATE DATABASE mydb, आदि के साथ एक MySQL कंटेनर पहले से ही निष्पादित है। यदि ऐसा है तो आपको docker-entrypoint-initdb.d का उपयोग करने की आवश्यकता है: https://docs.docker.com/samples/library/mysql/#docker -रहस्य

जब आधिकारिक MySQL कंटेनर पहली बार शुरू होता है, तो पहले एक नया डेटाबेस बनाया जाएगा। फिर यह एक्सटेंशन .sh, .sql और .sql.gz के साथ फाइलों को निष्पादित करेगा जो /docker-entrypoint-initdb.d में पाए जाते हैं। तो आपको बस इतना करना है कि /docker-entrypoint-initdb.d डायरेक्टरी बनाएं और वहां अपनी इनिशियलाइज़ेशन स्क्रिप्ट डालें।

8
Gene S 26 फरवरी 2018, 05:47

आधिकारिक MySQL docker छवि ने अपनी मूल छवि में init स्क्रिप्ट के लिए समर्थन जोड़ा। वे डॉकर हब पेज पर अपने "इनिशियलाइज़िंग ए फ्रेश इंस्टेंस" के तहत फीचर का दस्तावेजीकरण करते हैं।

MySQL डॉकर छवि में एकाधिक डेटाबेस और उपयोगकर्ता बनाने को हल करने के लिए मैंने जो कदम उठाए हैं, वे यहां दिए गए हैं:

  1. .docker नाम की स्थानीय निर्देशिका में इनिट फ़ाइल बनाएं (डॉकर छवि .sh, .sql, और .sql.gz फ़ाइलों को पहचानती है) जिसका नाम setup.sql है।
  2. आदेशों को setup.sql के अंदर रखें (उदाहरण के लिए नीचे देखें)
  3. सेटअप स्क्रिप्ट को docker-compose.yaml फ़ाइल के अंतर्गत निर्देशिका f में माउंट करें (उदाहरण के लिए नीचे देखें)
  4. docker-compose up -d चलाएं और MySQL setup.sql के अंदर कोड चलाएगा

नोट: स्क्रिप्ट फाइलों को वर्णानुक्रम में चलाएगी, इसलिए इसे ध्यान में रखें।

उदाहरण docker-compose.yaml

version: "3.5"
services:
    mysql:
        image: mysql
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: SomeRootPassword1!
            MYSQL_USER: someuser
            MYSQL_PASSWORD: Password1!
            MYSQL_DATABASE: somedatabase
        volumes:
            - .docker/setup.sql:/docker-entrypoint-initdb.d/setup.sql
            - db_data:/var/lib/mysql
volumes:
    db_data:

उदाहरण setup.sql

-- create the databases
CREATE DATABASE IF NOT EXISTS projectone;

-- create the users for each database
CREATE USER 'projectoneuser'@'%' IDENTIFIED BY 'somepassword';
GRANT CREATE, ALTER, INDEX, LOCK TABLES, REFERENCES, UPDATE, DELETE, DROP, SELECT, INSERT ON `projectone`.* TO 'projectoneuser'@'%';

FLUSH PRIVILEGES;
8
Jason M. 9 जिंदा 2020, 00:07
काम नहीं करता, मुझे त्रुटि मिलती है: myflashcards_db | 2020-04-08T18:51:57.851680Z 1 [त्रुटि] बूटस्ट्रैप फ़ाइल को खोलने में विफल /data/application/init.sql myflashcards_db | 2020-04-08T18:51:57.851718Z 1 [त्रुटि] 1105 बूटस्ट्रैप फ़ाइल त्रुटि, वापसी कोड (0)। निकटतम क्वेरी: 'सेट @@ sql_log_bin = @sql_log_bin;
 – 
Matley
8 अप्रैल 2020, 21:52