यदि आपके पास रास्पबेरी पाई है तो समस्या बहुत सरल और आसानी से पुन: उत्पन्न होती है। मैं एक बेस बैकअप से एक डॉकटर कंटेनर के अंदर चल रहे एक पोस्टग्रेस्क्ल 12 डेटाबेस को पुनर्स्थापित करने का प्रयास कर रहा हूं, लेकिन ऐसा होने से रोकने में समस्या यह है कि पीजी 12 और आर्मव 71 के साथ मैं डेटा निर्देशिका को हटाए गए कंटेनर को पुनरारंभ नहीं कर सकता, जैसा कि नीचे बताया गया है।

मैं दो अलग-अलग वातावरणों पर डॉकरहब के माध्यम से आधिकारिक postgresql docker कंटेनर का उपयोग कर रहा हूं, एक मेरा स्थानीय देव है पर्यावरण जो एक पीसी है जो उबंटू 18 एलटीएस चला रहा है, दूसरा रास्पबेरी पाई आर्मव 71 है।

मुझे जिस ऑपरेशन की आवश्यकता है, वह चल रहे कंटेनर पर /var/lib/postgresql/data की सामग्री को हटाना है, और फिर कंटेनर को पुनरारंभ करना है, यह दस्तावेज़ीकरण के अनुसार docker-entrypoint.sh स्क्रिप्ट को चलाने के लिए मजबूर करेगा, जिससे मेरी पुनर्स्थापना स्क्रिप्ट को आग लग जाएगी। (जो यह मेरी उबंटू मशीन पर करता है)।

तो मेरे पीसी पर यह प्रक्रिया ठीक काम करती है:

docker run --name website_db_1

यह बस डिफ़ॉल्ट/वेनिला पोस्टग्रेस्क्ल डॉकर कंटेनर लॉन्च करता है (मैंने उद्देश्य पर पासवर्ड छोड़ दिया है)

फिर, एक बार ऊपर और चलने के बाद, कंटेनर को docker-entrypoint.sh स्क्रिप्ट चलाने के लिए मजबूर करने के लिए मैं करता हूं:

docker exec -it website_db_1 bash -c "rm /var/lib/postgresql/data/* -r"
docker container restart website_db_1

कंटेनर को फिर से शुरू करना चाहिए, और जैसा कि मैं साइड पॉइंट करता हूं, अगर मुझे अपनी उपयुक्त पुनर्स्थापना स्क्रिप्ट को docker-entrpoint.sh फ़ाइल या init फ़ोल्डर में जोड़ना है, तो मुझे वाल आर्काइव रिस्टोर सही ढंग से काम करने के लिए मिलता है (मेरे उबंटू पीसी पर) .

हालांकि मेरे रास्पबेरी पाई पर armv71 आर्किटेक्चर पर, यह ठीक उसी कोड के परिणामस्वरूप कंटेनर लॉग में निम्न त्रुटि होती है:

initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
db_1                           | If you want to create a new database system, either remove or empty
db_1                           | the directory "/var/lib/postgresql/data" or run initdb
db_1                           | with an argument other than "/var/lib/postgresql/data".

यह कह रहा है कि निर्देशिका खाली नहीं है, लेकिन ऐसा होना चाहिए जैसा कि मैंने इसे पिछली पंक्ति से हटा दिया था, और कोड उबंटू पर ठीक काम करता है। पीआई पर भी, मैंने यह पुष्टि करने के लिए कंटेनर के भीतर से देखा है कि निर्देशिका खाली हो जाती है क्योंकि इसे पुनरारंभ करने से पहले होना चाहिए। क्या हो रहा है?

एक और दिलचस्प तथ्य, ऊपर दी गई यह प्रक्रिया postgres 11 का उपयोग करके दोनों आर्किटेक्चर पर ठीक काम करती है, मुझे केवल postgres 12 को अपडेट करने में कठिनाई हो रही है।

कोई विचार क्यों पीजी 12 इस मुद्दे को armv71 के साथ पैदा कर रहा है? यदि आपके पास पाई है तो यह आसानी से प्रतिलिपि प्रस्तुत करने योग्य है।

यदि यह महत्वपूर्ण है, तो मेरे द्वारा उपयोग किए जा रहे पोस्टग्रेस्क्ल संस्करण निम्नलिखित हैं:

PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on arm-unknown-linux-gnueabihf, compiled by gcc (Debian 8.3.0-6)
PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
0
Single Entity 24 पद 2019, 20:59

1 उत्तर

सबसे बढ़िया उत्तर

आपके द्वारा वर्णित अनुक्रम PostgreSQL डेटा निर्देशिका को हटाने का प्रयास करता है जबकि डेटाबेस अभी भी चल रहा है। यह सिर्फ चीजों को भ्रमित करने की संभावना है; जब docker stop डेटाबेस को शट डाउन करने का संकेत देता है तो यह संभवत: उस निर्देशिका में कुछ डेटा लिख ​​देगा, इसलिए जब यह पुनरारंभ होता है, तो यह वास्तव में खाली नहीं होगा।

इन डेटाबेस कंटेनरों का विशिष्ट उपयोग कंटेनर में कुछ भंडारण को माउंट करने के लिए docker run -v विकल्प का उपयोग करना है, ताकि यदि आप कंटेनर को हटाते हैं और फिर से बनाते हैं, तो अभी भी लगातार स्थिति बनी रहती है।

docker run \
  --name website_db_1 \
  --net website_net -p 5432:5432 \
  -v $PWD/postgres:/var/lib/postgresql/data \
  postgres:12

इसलिए जब ये निर्देश डेटाबेस स्थिति को हटाने के लिए कहते हैं, तो उनका मतलब कंटेनर को रोकना और होस्ट स्टोरेज को हटाना है:

docker stop website_db_1
docker rm website_db_1
rm -rf postgres
mkdir postgres
docker run \
  --name website_db_1 \
  --net website_net -p 5432:5432 \
  -v $PWD/postgres:/var/lib/postgresql/data \
  postgres:12

(नियमित उपयोग में आपको कंटेनरों को प्रशासित या संचालित करने के लिए docker exec का उपयोग करने की आवश्यकता नहीं होनी चाहिए। पहले स्टार्टअप पर स्वचालित रूप से सभी आवश्यक आरंभीकरण करने के लिए यहां postgres छवि व्यवहार बहुत विशिष्ट है। यदि आपको चलाने की आवश्यकता है psql शेल आप इसे होस्ट या किसी अन्य कंटेनर से कर सकते हैं।)

0
David Maze 24 पद 2019, 21:13