मैंने docker-entrypoint-initdb.d दृष्टिकोण (@Kuhess के लिए धन्यवाद) का उपयोग किया था, लेकिन मेरे मामले में मैं अपना DB कुछ मापदंडों के आधार पर बनाना चाहता हूं जिन्हें मैंने .env फ़ाइल में परिभाषित किया था इसलिए मैंने ये किया।
1) सबसे पहले मैं परिभाषित करता हूं। मेरे docker रूट प्रोजेक्ट डायरेक्टरी में कुछ इस तरह फाइल करें
MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306
2) फिर मैं अपने docker-compose.yml फ़ाइल को परिभाषित करता हूं। इसलिए मैंने अपने पर्यावरण चर को परिभाषित करने के लिए args निर्देश का उपयोग किया और मैंने उन्हें .env फ़ाइल से सेट किया
version: '2'
services:
### MySQL Container
mysql:
build:
context: ./mysql
args:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ports:
- "${MYSQL_PORT}:3306"
3) फिर मैं एक mysql फ़ोल्डर को परिभाषित करता हूं जिसमें एक Dockerfile शामिल है। तो डॉकरफाइल यह है
FROM mysql:5.7
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
4) अब मैं अपने db को डंप करने और mysql फ़ोल्डर के अंदर data.sql डालने के लिए mysqldump का उपयोग करता हूं
mysqldump -h <server name> -u<user> -p <db name> > data.sql
फ़ाइल एक सामान्य sql डंप फ़ाइल है, लेकिन मैं शुरुआत में 2 लाइनें जोड़ता हूं ताकि फ़ाइल इस तरह दिखे
--
-- Create a database using `MYSQL_DATABASE` placeholder
--
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;
-- Rest of queries
DROP TABLE IF EXISTS `x`;
CREATE TABLE `x` (..)
LOCK TABLES `x` WRITE;
INSERT INTO `x` VALUES ...;
...
...
...
तो क्या हो रहा है कि मैंने MYSQL_DATABASE
अपने DB के नाम के साथ प्लेसहोल्डर को बदलने के लिए "RUN sed -i '/ MYSQL_DATABASE /' $ MYSQL_DATABASE '/ g' /etc/mysql/data.sql" कमांड का उपयोग किया है। .env फ़ाइल।
|- docker-compose.yml
|- .env
|- mysql
|- Dockerfile
|- data.sql
अब आप अपने कंटेनर को बनाने और चलाने के लिए तैयार हैं
RUN
कमांड को एक अलग कंटेनर में निष्पादित किया जाता है। यह यहाँ अच्छी तरह से समझाया गया है: stackoverflow.com/questions/17891669/…