मैं 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 के कार्य की व्याख्या कर सकता है?
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 (...);
डेटाबेस शायद पहले से ही आरंभिक है और कॉन्फ़िगरेशन /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 इमेज नए सिरे से शुरू होगी और पर्यावरण अनुभाग के माध्यम से आपके द्वारा प्रदान किए गए कॉन्फ़िगरेशन के साथ डेटाबेस को इनिशियलाइज़ करेगी।
docker stop $(docker ps -a -q)
, docker rm $(docker ps -a -q)
और docker rmi $(docker images -q)
करने से इसका समाधान नहीं हुआ। मैंने सोचा होगा कि सब कुछ काम कर गया होगा।
आपके प्रश्न का उत्तर...
एक नया डॉकटर कंटेनर बनाते समय मैं एक चीज का उपयोग करता हूं, यह समझ में आता है कि मैं जिस छवि से खींचता हूं वह निर्माण के दौरान क्या करती है।
आपके 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
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/...
)
अगर मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप इसमें एक विशिष्ट डेटाबेस के साथ एक कंटेनर रखना चाहते हैं। जैसे 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
डायरेक्टरी बनाएं और वहां अपनी इनिशियलाइज़ेशन स्क्रिप्ट डालें।
आधिकारिक MySQL docker छवि ने अपनी मूल छवि में init स्क्रिप्ट के लिए समर्थन जोड़ा। वे डॉकर हब पेज पर अपने "इनिशियलाइज़िंग ए फ्रेश इंस्टेंस" के तहत फीचर का दस्तावेजीकरण करते हैं।
MySQL डॉकर छवि में एकाधिक डेटाबेस और उपयोगकर्ता बनाने को हल करने के लिए मैंने जो कदम उठाए हैं, वे यहां दिए गए हैं:
.docker
नाम की स्थानीय निर्देशिका में इनिट फ़ाइल बनाएं (डॉकर छवि .sh, .sql, और .sql.gz फ़ाइलों को पहचानती है) जिसका नामsetup.sql
है।- आदेशों को
setup.sql
के अंदर रखें (उदाहरण के लिए नीचे देखें) - सेटअप स्क्रिप्ट को
docker-compose.yaml
फ़ाइल के अंतर्गत निर्देशिकाf
में माउंट करें (उदाहरण के लिए नीचे देखें) docker-compose up -d
चलाएं और MySQLsetup.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;
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
mysql
MySQL एक फ्री, ओपन सोर्स रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है जो स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) का उपयोग करता है। इस टैग को अन्य DBs जैसे SQL Server, SQLite आदि के लिए उपयोग न करें। वे विभिन्न DB हैं जो सभी डेटा का प्रबंधन करने के लिए SQL की अपनी बोलियों का उपयोग करते हैं।
/data/application/init.sql
MySQL के लिए एक तर्क है जो कंटेनर में चलता है, पथ को "आंतरिक" भी होना चाहिए। बाइंड माउंटेड होने से फाइल वहां पहुंच सकती है।/data/application/init.sql
कहा जाता है, जब तक फ़ाइल कंटेनर पर पहले से मौजूद नहीं है। कंटेनर में फ़ाइल के रूप में प्रदर्शित होने के लिए होस्ट फ़ाइल को माउंट करने के बारे में बाइंड माउंट के बारे में डॉकर डॉक्स।docker-compose.yml
के अंदर वॉल्यूम पथ उस फ़ाइल के सापेक्ष हैं, इसलिए यदि यह रूट प्रोजेक्ट निर्देशिका में है और हमारे माउंट में./init.sql:/data/application/init.sql
है तोinit.sql
फ़ाइल को रूट निर्देशिका में भी होना चाहिए