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


213

मैं एक कस्टम उपयोगकर्ता और डेटाबेस बनाकर एक विकास पोस्टग्रेज उदाहरण के लिए एक कंटेनर स्थापित करने की कोशिश कर रहा हूं। मैं ऑफिशियल पोस्टग्रैस डॉकटर इमेज का उपयोग कर रहा हूं । प्रलेखन में यह आपको निर्देश देता है कि आप अंदर बैश स्क्रिप्ट डालें/docker-entrypoint-initdb.d/ किसी भी कस्टम पैरामीटर के साथ डेटाबेस सेट करने फ़ोल्डर के ।

मेरी बैश स्क्रिप्ट: make_db.sh

su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"

Dockerfile

FROM library/postgres

RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/

मुझे जो त्रुटि मिलती है docker logs -f db(db मेरा कंटेनर नाम है):

Createuser: डेटाबेस पोस्टग्रेट्स से कनेक्ट नहीं हो सका: सर्वर से कनेक्ट नहीं हो सका: ऐसी कोई फ़ाइल या निर्देशिका नहीं

ऐसा लगता है कि /docker-entrypoint-initdb.d/फ़ोल्डर के अंदर कमांड को पोस्टग्रैज शुरू होने से पहले निष्पादित किया जा रहा है। मेरा सवाल है, मैं आधिकारिक पोस्टग्रेज कंटेनर का उपयोग करके उपयोगकर्ता / डेटाबेस को प्रोग्रामेटिक रूप से कैसे सेट करूं? क्या स्क्रिप्ट के साथ ऐसा करने का कोई तरीका है?

जवाबों:


378

EDIT - जुलाई 23, 2015 के बाद से

आधिकारिक postgres डोकर छवि चलेंगे .sqlलिपियों में पाया /docker-entrypoint-initdb.d/फ़ोल्डर।

तो आपको निम्नलिखित एसक्यूएल स्क्रिप्ट बनाने की आवश्यकता है:

init.sql

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

और इसे अपने डॉकरफाइल में जोड़ें:

Dockerfile

FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

लेकिन जुलाई 8 वीं, 2015, के बाद से यदि आपको केवल एक उपयोगकर्ता और डेटाबेस बनाने के लिए है , यह करने के लिए सिर्फ मेकअप उपयोग करने के लिए आसान है POSTGRES_USER, POSTGRES_PASSWORDऔर POSTGRES_DBवातावरण चर:

docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

या डॉकफाइल के साथ:

FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

23 जुलाई 2015 से पुरानी छवियों के लिए

से postgres डोकर छवि के प्रलेखन , यह कहा जाता है कि

[...] यह किसी भी * .sh स्क्रिप्ट को उस निर्देशिका में पाया जाता है [ /docker-entrypoint-initdb.d] सेवा शुरू करने से पहले आगे की शुरुआत करने के लिए [ ]

यहाँ महत्वपूर्ण है "सेवा शुरू करने से पहले" । इसका मतलब है कि आपकी स्क्रिप्ट make_db.sh को पोस्टग्रेज सेवा शुरू होने से पहले निष्पादित किया जाएगा, इसलिए त्रुटि संदेश "डेटाबेस पोस्टग्रेज से कनेक्ट नहीं हो सका"

उसके बाद एक और उपयोगी जानकारी है:

यदि आपको अपने आरंभ के हिस्से के रूप में SQL कमांड निष्पादित करने की आवश्यकता है, तो Postgres एकल उपयोगकर्ता मोड का उपयोग अत्यधिक अनुशंसित है।

इस पर सहमत पहली नज़र में थोड़ा रहस्यमय हो सकता है। यह क्या कहता है कि आपकी इनिशियलाइज़ेशन स्क्रिप्ट को अपने कार्यों को करने से पहले पोस्टग्रेज सेवा को एकल मोड में शुरू करना चाहिए। इसलिए आप अपनी make_db.ksh स्क्रिप्ट को निम्नानुसार बदल सकते हैं और यह आपको जो आप चाहते हैं उसके करीब पहुंचना चाहिए:

ध्यान दें , यह हाल ही में निम्नलिखित प्रतिबद्ध में बदल गया है । यह नवीनतम परिवर्तन के साथ काम करेगा:

export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

पहले, --singleमोड के उपयोग की आवश्यकता थी:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

2
आप के साथ कर सकते हैं:gosu postgres postgres --single < /tmp/somefile.sql
थॉमसलेविल

1
मैं कैसे चला सकता हूँpsql -U myDb -d myDb -f myDb.sql
दारवर

3
ध्यान दें, - किसी भी पोस्टग्रे डॉकफाइल्स में अब सिंगिंगल का समर्थन नहीं किया गया है।
23

1
मैंने चरणों का पालन किया और जब मैं mysql कंटेनर में सीडी और सीडी में docker-entrypoint-initdb.dदेखता हूं तो मुझे init.sqlइसमें sql कोड दिखाई देता है। लेकिन जब मैं mysql (रूट एक्सेस का उपयोग करके) खोलता हूं और शो डेटाबेस टाइप करता हूं तो मुझे docker-compose.ymlफाइल से केवल डिफ़ॉल्ट दिखाई देता है! यह मेरे लिए काम क्यों नहीं कर रहा है?
महमूद ज़ाल्ट

1
इसके क्रियान्वित नहीं db.sqlकरने के बाद भी यह `को कॉपी किया है डोकर-entrypoint-initdb.d`
कमल

16

अब आप .sql फ़ाइलों को init डायरेक्टरी के अंदर रख सकते हैं:

डॉक्स से

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

तो आपके .sql फ़ाइल को कॉपी करने से काम चल जाएगा।


उपयोगकर्ता / पासवर्ड और डीबी निर्माण के लिए पर्यावरण चर अभी भी काम करता है। (9.5.3)
यिर्मयाह एडम्स

1
मेरे पास एक प्रोजेक्ट है जो स्थानीय स्तर पर काम करता है। हालाँकि, जब मैं इसे एडब्ल्यूएस ईसी 2 में ले जाता हूं, तो यह कहता है कि डीबी नहीं मिला है। मैं उचित निर्देशिका में .sql फ़ाइल की प्रतिलिपि बनाता हूं, लेकिन यह अभी भी उस त्रुटि को लौटाता है। कोई भी विचार जहां मैं देख सकता था? मैं डॉकटर के लिए नया हूं।
MadPhysicist 22

1
यह केवल तभी सच है जब एक एकल db उदाहरण एकल वॉल्यूम से बंधा हो, अर्थात यह किसी भी स्क्रिप्ट को नहीं चलाएगा यदि कुछ भी पहले से वॉल्यूम फ़ोल्डर में है। यह मुझे एक सिरदर्द देता है, क्योंकि मैं अपनी प्रत्येक स्टैक सेवाओं के लिए एक अलग डीबी आरंभीकरणकर्ता बनाना चाहता हूं।
वायलेट रेड

9

का उपयोग करके docker-compose:

मान लें कि आपके पास निम्न निर्देशिका लेआउट है:

$MYAPP_ROOT/docker-compose.yml
           /Docker/init.sql
           /Docker/db.Dockerfile

फ़ाइल: docker-compose.yml

version: "3.3"
services:
  db:
    build:
      context: ./Docker
      dockerfile: db.Dockerfile
    volumes:
      - ./var/pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

फ़ाइल: Docker/init.sql

CREATE USER myUser;

CREATE DATABASE myApp_dev;
GRANT ALL PRIVILEGES ON DATABASE myApp_dev TO myUser;

CREATE DATABASE myApp_test;
GRANT ALL PRIVILEGES ON DATABASE myApp_test TO myUser;

फ़ाइल: Docker/db.Dockerfile

FROM postgres:11.5-alpine
COPY init.sql /docker-entrypoint-initdb.d/

रचना और सेवा शुरू करना:

docker-compose -f docker-compose.yml up --no-start
docker-compose -f docker-compose.yml start

8

मैं सेवाओं को शुरू करने के बाद सीएमडी में विकसित वातावरण में कस्टम कमांड जोड़ता हूं ... मैंने इसे पोस्टग्रेज के साथ नहीं, बल्कि ओरेकल के साथ किया है:

#set up var with noop command
RUN export POST_START_CMDS=":"
RUN mkdir /scripts
ADD script.sql /scripts
CMD service oracle-xe start; $POST_START_CMDS; tail -f /var/log/dmesg

और से शुरू करें

docker run -d ... -e POST_START_CMDS="su - oracle -c 'sqlplus @/scripts/script' " <image>


7

आप इस आदेश का उपयोग कर सकते हैं:

docker exec -it yournamecontainer psql -U postgres -c "CREATE DATABASE mydatabase ENCODING 'LATIN1' TEMPLATE template0 LC_COLLATE 'C' LC_CTYPE 'C';"

docker exec -it yournamecontainer psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE postgres TO postgres;"

3
ENCODING 'LATIN1'बहुत अजीब है ... आपको utf8
Zyigh

4

उपयोगकर्ताओं को बनाने से पहले आपको डेटाबेस चलाना होगा। इसके लिए आपको कई प्रक्रियाओं की आवश्यकता होती है। आप या तो शेल स्क्रिप्ट में एक उपधारा (और) में पोस्टग्रेज शुरू कर सकते हैं, या पोस्टग्रेज को चलाने के लिए सुपरवाइजर जैसे टूल का उपयोग कर सकते हैं और फिर किसी इनिशियलाइज़ेशन स्क्रिप्ट को चला सकते हैं।

पर्यवेक्षक और मार्गदर्शक के लिए एक गाइड https://docs.docker.com/articles/using_supervisord/


2

डॉक रचना के साथ एक सरल विकल्प है (डॉकरफाइल बनाने की कोई आवश्यकता नहीं है)। बस एक init-database.sh बनाएँ:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER docker;
    CREATE DATABASE my_project_development;
    GRANT ALL PRIVILEGES ON DATABASE my_project_development TO docker;
    CREATE DATABASE my_project_test;
    GRANT ALL PRIVILEGES ON DATABASE my_project_test TO docker;
EOSQL

और इसे खंड खंड में देखें:

version: '3.4'

services:
  postgres:
    image: postgres
    restart: unless-stopped
    volumes:
      - postgres:/var/lib/postgresql/data
      - ./init-database.sh:/docker-entrypoint-initdb.d/init-database.sh
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - 5432:5432

volumes:
  postgres:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.