मैं कस्टम Dockerfile . का उपयोग करके इसे काम करने में कामयाब रहा , ये रहा मेरा समाधान:
परियोजना संरचना
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
फ़ाइलें
-
CSVफ़ाइलdata. में स्थित है प्रोजेक्ट के अंदर फ़ोल्डर। -
प्रोजेक्ट फ़ोल्डर में निम्नलिखित है
docker-compose.ymlफ़ाइल:version: '3.3' services: db: build: ./db container_name: postgres ports: - "5431:6666" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=db_name volumes: - ./data:/data -
Dockerfileइसमें शामिल हैं:FROM postgres:alpine ADD scripts/1_init.sql /docker-entrypoint-initdb.d ADD scripts/2_copy.sql /docker-entrypoint-initdb.d RUN chmod a+r /docker-entrypoint-initdb.d/* EXPOSE 6666 -
1_init.sqlशरीर:CREATE TABLE table_name ( --statement body ); -
और
2_copy.sql:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
स्पष्टीकरण
1_init.sql DB तालिका बनाता है, इसमें CSV फ़ाइल के समान कॉलम नाम होने चाहिए . 2_copy.sql सीएसवी से पोस्टग्रेज में डेटा कॉपी करने के लिए जिम्मेदार है।
Dockerfile पोस्टग्रेज छवि का उपयोग करता है और सभी *.sql . को कॉपी करता है /docker-entrypoint-initdb.d/ पर फ़ाइलें . बाद में, सभी फाइलों को अल्फ़ान्यूमेरिकल क्रम में निष्पादित किया जाता है, इसीलिए *.sql फाइलें अंकों से शुरू होती हैं। अंत में, पोर्ट 6666 उजागर है।
docker-compose.yml Dockerfile बनाता है db . से फ़ोल्डर और इसे 5431 . के माध्यम से एक्सेस करने योग्य बनाएं बंदरगाह। पर्यावरणीय गुणों के रूप में मूल पोस्टग्रेज गुणों का उपयोग किया जाता है। और अंत में data CSV फ़ाइल वाले फ़ोल्डर को कंटेनर में कॉपी किया जाता है।