डॉक्यूमेंट किए गए डेटाबेस में डेटा को जारी रखने के लिए वॉल्यूम का उपयोग करके पोस्टग्रैजेस कैसे करें


204

मेरी डॉक कम्पोज़ फ़ाइल में तीन कंटेनर, वेब, नेग्नेक्स और पोस्टग्रेज हैं। इस तरह दिखता है पोस्टग्रैज:

postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - "5432:5432

मेरा लक्ष्य एक मात्रा को माउंट करना है जो एक स्थानीय फ़ोल्डर से मेल खाती है जिसे ./databaseपोस्टग्रैज कंटेनर के अंदर कहा जाता है /var/lib/postgres। जब मैं इन कंटेनरों को शुरू करता हूं और पोस्टग्रेज में डेटा सम्मिलित करता हूं, तो मैं सत्यापित करता हूं कि मैं /var/lib/postgres/data/base/जो डेटा जोड़ रहा हूं (पोस्टग्रेज कंटेनर में) भरा हुआ है, लेकिन मेरे स्थानीय सिस्टम में, इसमें ./databaseकेवल एक dataफ़ोल्डर मिलता है , अर्थात ./database/dataबनाया जाता है, लेकिन यह खाली है । क्यों?

टिप्पणियाँ:

अद्यतन १

निक के सुझाव के अनुसार, मैंने किया docker inspectऔर पाया:

    "Mounts": [
        {
            "Source": "/Users/alex/Documents/MyApp/database",
            "Destination": "/var/lib/postgresql",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
            "Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

इससे ऐसा लगता है कि डेटा को किसी अन्य वॉल्यूम द्वारा चुराया जा रहा है जिसे मैंने खुद कोड नहीं किया था। यकीन नहीं है क्यों वैसा है। क्या पोस्टग्रेज इमेज मेरे लिए वह वॉल्यूम बना रही है? यदि हां, तो क्या मेरे पुनः आरंभ होने पर वॉल्यूम के बजाय उस वॉल्यूम का उपयोग करने का कोई तरीका है जो मैं बढ़ रहा हूं? अन्यथा, क्या उस अन्य वॉल्यूम को अक्षम करने और मेरे स्वयं का उपयोग करने का एक अच्छा तरीका है ./database,?

अद्यतन २

मैं समाधान मिल गया, निक के लिए धन्यवाद! (और दूसरा दोस्त) नीचे उत्तर दें।


क्या आप पहले से ही initdbअपने डेटाबेस क्लस्टर को इनिशियलाइज़ करने के लिए कमांड लाइन चलाते हैं ?
सेबस्टियन वेबर

क्या आप सुनिश्चित हैं कि आपका डेटा उपनिर्देशिका वास्तव में खाली है? इसमें विशेष पहुंच की अनुमति हो सकती है।
यारोस्लाव स्टावनिचि

मुझे इतनी जल्दी वापस पाने के लिए धन्यवाद! मैं एक फ्लास्क ऐप का उपयोग कर रहा हूं, इसलिए मैं from app import dbऔर कंटेनर शुरू करने के बाद db.create_all()से docker run। मैं initdbसीधे कमांड लाइन से नहीं ।
एलेक्स लेनेल

1
@YaroslavStavnichiy मैं और कैसे की जाँच करने के तुलना में पता नहीं है sudo su -और में देखो ./database/data। वहाँ कुछ भी नहीं है जहाँ तक मैं बता सकता हूँ।
एलेक्स लेनेल

किसी को यह उपयोगी लग सकता है: नमूना कम्पोज फाइल को
बनाए

जवाबों:


252

अजीब तरह से, समाधान समाप्त होने के लिए बदल रहा है

volumes:
  - ./postgres-data:/var/lib/postgresql

सेवा

volumes:
  - ./postgres-data:/var/lib/postgresql/data

45
इस उत्तर के लिए बस एक त्वरित "क्यों" (जो काम करता है)। डिफ़ॉल्ट रूप से लोगों के अनुसार, डिफ़ॉल्ट डेटा निर्देशिका है /var/lib/postgresql/data- आप यहां PGDATA चर नोट पढ़ सकते हैं: store.docker.com/images/…
मैट पावले

2
उपरोक्त प्रश्न में, ओपी का कहना है कि यह उसके लिए अंत में / डेटा के बिना काम करता है। क्या वो सही है?
सिड

2
और अपनी .dockerignoreफ़ाइल में स्थानीय निर्देशिका को जोड़ें , खासकर यदि आप कभी भी इसे एक उत्पादन छवि में बदल देंगे। चर्चा के लिए codefresh.io/blog/not-ignore-dockerignore देखें ।
dsz

4
यह अभी भी मेरे लिए काम नहीं करता है (मैक ओएस एक्स उच्च सिएरा)
olidem

1
@ ओलीड-मेट्ज़ मुझे docker rm my_postgres_container_1काम करने से पहले करना पड़ा (हाई सिएरा भी)।
अमीर

100

आप सभी Postgres डेटा के लिए एक सामान्य वॉल्यूम बना सकते हैं

 docker volume create pgdata

या आप इसे कंपोज़ फ़ाइल में सेट कर सकते हैं

   version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:

यह वॉल्यूम नाम pgdata बनाएगा और कंटेनर के पथ पर इस वॉल्यूम को माउंट करेगा ।

आप इस वॉल्यूम का निरीक्षण कर सकते हैं

docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

8
थोड़ी देर से टिप्पणी कर रहा हूं, लेकिन अगर मैं करता हूं तो यह स्पष्ट डेटा नहीं होगा docker-compose down -v। और इसका क्या उपाय है?
सिड

3
@ से, हाँ, यह होगा! बस इस विकल्प के साथ सावधान रहें।
--लिडेम

1
इसलिए डॉकटर-कंपोज के साथ [मात्रा] अब नहीं बनी हुई है? क्या वॉल्यूम की भी पूरी सफाई होती है?
पॉल

2
यहां तक कि बाद में टिप्पणी करते हुए @Sid, लेकिन आप कर सकते हैं का उपयोग docker-compose down --rmi all बिना-v विकल्प है और यह "सब कुछ" बाहर साफ़ करनी होगी छोड़कर संस्करणों, यानी कंटेनर, नेटवर्क, चित्र, आदि मैं करता हूँ जब, जबकि डेटा हठ की इजाजत दी तैनाती है।
code_dredd

13

मैं एक रिश्तेदार पथ का उपयोग करने से बचना चाहिए। याद रखें कि docker एक डेमन / क्लाइंट रिलेशनशिप है।

जब आप कम्पोज़ को अंजाम दे रहे हैं, तो यह अनिवार्य रूप से विभिन्न डॉकटर क्लाइंट कमांड्स में टूट रहा है, जो तब डेमॉन को पास किए जाते हैं। यही कारण है कि ./databaseतब के सापेक्ष है डेमॉन , नहीं ग्राहक।

अब, docker dev टीम के पास इस मुद्दे पर कुछ आगे और पीछे हैं , लेकिन लब्बोलुआब यह है कि कुछ अप्रत्याशित परिणाम हो सकते हैं।

संक्षेप में, एक सापेक्ष पथ का उपयोग न करें, एक निरपेक्ष पथ का उपयोग करें।


इस उत्तर के लिए धन्यवाद! अफसोस की बात है, मुझे नहीं लगता कि यह काम किया है। मैंने लाइन को एक निरपेक्ष पथ में बदल दिया, और डेटा डालने के बाद, database/dataफ़ोल्डर अभी भी खाली है = (
एलेक्स लेनेल

के। अगला docker inspectकंटेनर पर चलने और यह सुनिश्चित करने के लिए है कि कंटेनर को मात्रा के बारे में पता है (बस मामले में गड़बड़ है या कुछ और है)। (ध्यान दें: डॉकटर के पास संवेदनशील डेटा हो सकता है, इसलिए इसे बिना गूंथे यहां पेस्ट न करें ;-) इसके बाद, यह अनुमतियों की जांच करने का मामला है (हालांकि आमतौर पर यह एक त्रुटि दिखाएगा)
निक बर्क

अहा! @ निक बर्क मुझे लगता है कि आपने कुछ पाया है। मैंने सवाल अपडेट किया है।
एलेक्स लेनेल

2

मुझे लगता है कि आपको केवल पहले docker के बाहर अपना वॉल्यूम बनाने की आवश्यकता है docker create -v /location --nameऔर फिर उसका पुनः उपयोग करें।

और जब तक मैं डॉकटर का बहुत उपयोग करता था, तब तक डॉकफाइल परिभाषा के साथ एक स्थिर डॉक वॉल्यूम का उपयोग करना संभव नहीं था, इसलिए मेरा सुझाव कमांड लाइन (अंततः एक स्क्रिप्ट के साथ) का प्रयास करना है।


0

मैं दिनों के लिए एक ही मुद्दा था। मेरा मामला केवल एक टाइपो था: "पोस्टग्रैस्कल" में केवल एक "एस" लिखा है I दो (पोस्टग्रैक्कल: $)।


आपको क्या लगता है कि एक ही टाइपो उस व्यक्ति के लिए हुआ था जिसने यह सवाल पूछा था कि आपके द्वारा संदर्भित टाइपो उनके प्रश्न में दिखाई नहीं देता है?
जेसन एलेर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.