2015-10-23 8 views
16

में टेबल बनाने के लिए डॉकर-कंपोज़ का उपयोग करना मैं मल्टीकॉन्टेनर पायथन फ्लास्क वेब एप्लिकेशन को तैनात करने के लिए डॉकर-कंपोज़ का उपयोग कर रहा हूं। मुझे बिल्डिंग के दौरान postgresql डेटाबेस में टेबल बनाने के तरीके को समझने में कठिनाई हो रही है, इसलिए मुझे उन्हें psql के साथ मैन्युअल रूप से जोड़ने की आवश्यकता नहीं है।पोस्टग्रेस्क्ल डेटाबेस

मेरे डोकर-compose.yml फ़ाइल है:

web: 
    restart: always 
    build: ./web 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - /usr/src/flask-app/static 
    env_file: .env 
    command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app 

nginx: 
    restart: always 
    build: ./nginx/ 
    ports: 
    - "80:80" 
    volumes: 
    - /www/static 
    volumes_from: 
    - web 
    links: 
    - web:web 

data: 
    restart: always 
    image: postgres:latest 
    volumes: 
    - /var/lib/postgresql 
    command: "true" 

postgres: 
    restart: always 
    image: postgres:latest 
    volumes_from: 
    - data 
    ports: 
    - "5432:5432" 

मैं आदेश में टाइप करने में psql दर्ज करने के लिए करना चाहते हैं न:

CREATE DATABASE my_database; 
CREATE USER this_user WITH PASSWORD 'password'; 
GRANT ALL PRIVILEGES ON DATABASE "my_database" to this_user; 
\i create_tables.sql 

मैं कैसे बनाने के लिए पर मार्गदर्शन की सराहना करेंगे टेबल।

उत्तर

16

मैं आदेश आप बस कंटेनर का उपयोग कर सकते

में टाइप करने में psql दर्ज करने के लिए करना चाहते हैं न निर्मित init तंत्र:

COPY init.sql /docker-entrypoint-initdb.d/10-init.sql

यह सुनिश्चित करती है कि आपके डीबी सर्वर ठीक से बूट होने के बाद एसक्यूएल निष्पादित किया जाता है।

उनके एंट्रीपॉइंट script पर एक नज़र डालें। यह psql को सही ढंग से शुरू करने के लिए कुछ तैयारी करता है और .sh, .sql और .sql.gz में समाप्त होने वाली फ़ाइलों के लिए /docker-entrypoint-initdb.d/ निर्देशिका में दिखता है।

10- फ़ाइल नाम में है क्योंकि फ़ाइलों को ASCII क्रम में संसाधित किया जाता है। उदाहरण के लिए आप 20-create-tables.sql और 30-seed-tables.sql.gz जैसी अन्य इनिट फ़ाइलों को नाम दे सकते हैं और सुनिश्चित कर सकते हैं कि आपको आवश्यकता के अनुसार संसाधित किया जा सके।

यह भी ध्यान दें कि कमांडिंग does not डेटाबेस निर्दिष्ट करें। अगर आप कहते हैं, तो ध्यान रखें, डॉकर-कंपोज़ में माइग्रेट करना और आपकी मौजूदा .sql फ़ाइलें डीबी निर्दिष्ट नहीं करती हैं।

आपकी फ़ाइलों को build चरण के कंटेनर की पहली शुरुआत में संसाधित किया जाएगा।चूंकि डॉकर कंपोज़ छवियों को रोकता है और फिर उन्हें फिर से शुरू करता है, इसमें कोई अंतर नहीं है, लेकिन यदि आपके लिए build चरण पर डीबी को डालने के लिए महत्वपूर्ण है, तो मैं आपके डॉकरफ़ाइल से /docker-entrypoint.sh पर कॉल करके अंतर्निहित इनिट विधि का उपयोग करने का सुझाव देता हूं और फिर /docker-entrypoint-initdb.d/ निर्देशिका पर सफाई करता हूं ।

+0

यह पोस्टग्रेस छवि के नवीनतम संस्करण के साथ काम नहीं करता है :( – dopatraman

9

मैं बिल्ड प्रक्रिया के हिस्से के रूप में टेबल बनाउंगा। एक नया निर्देशिका ./database/

FROM postgres:latest 
COPY . /fixtures 
WORKDIR /fixtures 
RUN /fixtures/setup.sh 

./database/setup.sh में एक नया Dockerfile बनाएं कुछ इस तरह दिखेगा:

#!/bin/bash 
set -e 

/etc/init.d/postgresql start 
psql -f create_fixtures.sql  
/etc/init.d/postgresql stop 

अपने बनाने उपयोगकर्ता रखो, डाटाबेस बनाने, एक में टेबल एसक्यूएल (और किसी भी अन्य स्थिरता डेटा) बनाने create_fixtures.sql./database/ निर्देशिका में फ़ाइल।

और अंत में अपने postgres सेवा build उपयोग करने के लिए बदल जाएगा:

postgres: 
    build: ./database/ 
    ... 

नोट: कभी कभी तुम एक sleep 5 (या और भी बेहतर एक स्क्रिप्ट पोल और प्रतीक्षा करने के लिए PostgreSQL शुरू करने के लिए) की आवश्यकता होगी /etc/init.d/postgresql start पंक्ति के बाद । मेरे अनुभव में या तो init स्क्रिप्ट या psql क्लाइंट यह आपके लिए संभालता है, लेकिन मुझे पता है कि MySQL के साथ मामला नहीं है, इसलिए मैंने सोचा कि मैं इसे कॉल करूँगा।

+0

सहायता के लिए धन्यवाद। डॉकर-compose.yml निर्माण करते समय मैंने इस त्रुटि में भाग लिया है। 'bin/sh: 1: /fixtures/setup.sh: अनुमति अस्वीकार सेवा 'पोस्टग्रेस' बनाने में विफल: कमांड '/ bin/sh -c /fixtures/setup.sh' ने एक गैर-शून्य कोड लौटाया: 126' – blahblahblah

+0

ठीक है, आप स्क्रिप्ट के शीर्ष पर 'set -x' भी जोड़ सकते हैं, इसलिए यह प्रत्येक चरण को प्रिंट करेगा, और आप यह पता लगा सकते हैं कि यह कहां विफल हो रहा है। – dnephin

+0

मैंने 'रन chmod + x/fixtures/setup.sh' जोड़ा जो उस समस्या को हल करता है। अब मुझे 'कोई PostgreSQL क्लस्टर मौजूद नहीं है; "आदमी pg_createcluster" देखें ... (चेतावनी)। psql: सर्वर से कनेक्ट नहीं हो सका: ऐसी कोई फ़ाइल या निर्देशिका \t क्या सर्वर स्थानीय रूप से चल रहा है और \t यूनिक्स डोमेन सॉकेट "/var/run/postgresql/.s.PGSQL.5432" पर कनेक्शन स्वीकार कर रहा है? सेवा 'postgres' बनाने में विफल रहा: कमांड '/ bin/sh -c /fixtures/setup.sh' ने एक गैर-शून्य कोड लौटाया: 2' – blahblahblah

संबंधित मुद्दे