ডকার পোস্টগ্রিসের জন্য স্ক্রিপ্টে কীভাবে ব্যবহারকারী / ডাটাবেস তৈরি করবেন


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(ডিবি আমার ধারকের নাম) থেকে আমি যে ত্রুটিটি পেয়েছি তা হ'ল:

ক্রিয়েটর: ডেটাবেস পোস্টগ্রিসের সাথে সংযোগ করতে পারেনি: সার্ভারের সাথে সংযোগ স্থাপন করা যায়নি: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

দেখে মনে /docker-entrypoint-initdb.d/হচ্ছে পোস্টগ্রিজ শুরু হওয়ার আগে ফোল্ডারের অভ্যন্তরের কমান্ডগুলি কার্যকর করা হচ্ছে। আমার প্রশ্নটি হল, আমি কিভাবে অফিসিয়াল পোস্টগ্রিজ ধারক ব্যবহার করে প্রোগ্রাম / ব্যবহারকারী হিসাবে ডেটাবেস সেট করব? স্ক্রিপ্ট দিয়ে এটি করার কোনও উপায় আছে কি?

উত্তর:


378

সম্পাদনা - 23 জুলাই, 2015 থেকে

সরকারী postgres Docker ইমেজ চালানো হবে .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/

কিন্তু জুলাই 8th, 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 এর চেয়ে পুরানো চিত্রগুলির জন্য

পোস্টগ্রিস ডকার চিত্রের ডকুমেন্টেশন থেকে , এটি বলা হয়

[...] /docker-entrypoint-initdb.dপরিষেবাটি শুরুর আগে আরও সূচনা করার জন্য এটি সেই ডিরেক্টরিতে পাওয়া কোনও * .sh স্ক্রিপ্টের উত্স তৈরি করবে

এখানে গুরুত্বপূর্ণ যা "পরিষেবা শুরু করার আগে" । এর অর্থ আপনার স্ক্রিপ্ট Make_db.sh পোস্টগ্রিজ পরিষেবা শুরু হওয়ার আগেই কার্যকর করা হবে, সুতরাং ত্রুটি বার্তাটি "ডাটাবেস পোস্টগ্রাসের সাথে সংযোগ স্থাপন করতে পারেনি"

এর পরে তথ্যের আরও একটি দরকারী অংশ রয়েছে:

আপনার প্রারম্ভিক অংশ হিসাবে যদি আপনাকে এসকিউএল কমান্ডগুলি কার্যকর করতে হয়, তবে পোস্টগ্রিসের একক ব্যবহারকারী মোড ব্যবহারের জন্য সুপারিশ করা হয়।

সম্মত হ'ল প্রথম বর্ণনায় এটি কিছুটা রহস্যজনক হতে পারে। এটি যা বলে তা হ'ল আপনার সূচনা স্ক্রিপ্টটির ক্রিয়াকলাপগুলি করার আগে একক মোডে পোস্টগ্রিজ পরিষেবাটি শুরু করা উচিত। সুতরাং আপনি নিম্নলিখিত হিসাবে আপনার 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
দ্রষ্টব্য, --সিংসেল আর কোনও পোস্টগ্রিস ডকফিলফিলসে সমর্থিত নয়।
ব্রায়ানজ

1
আমি পদক্ষেপগুলি অনুসরণ করেছিলাম এবং যখন আমি মাইএসকিএল ধারকটিতে সিডি docker-entrypoint-initdb.dকরি init.sqlএবং এতে সিডিএল কোডটি দিয়ে আমার দেখতে পাই । কিন্তু যখন আমি মাইএসকিএল খুলি (রুট অ্যাক্সেস ব্যবহার করে) এবং প্রদর্শন ডাটাবেসগুলি টাইপ করি তখন docker-compose.ymlফাইল থেকে কেবলমাত্র ডিফল্ট দেখতে পাই ! এটা আমার জন্য কাজ করছে না কেন?
মাহমুদ জাল্ট

1
তার নির্বাহ না db.sqlপরেও এটা `তে অনুলিপি করা Docker-entrypoint-initdb.d`
কামাল

16

আপনি এখন ডিরেক্টরি ডিরেক্টরি ভিতরে .sql ফাইল রাখতে পারেন:

ডক্স থেকে

আপনি যদি এ থেকে প্রাপ্ত কোনও চিত্রে অতিরিক্ত সূচনা করতে চান তবে /docker-entryPoint-initdb.d এর অধীনে এক বা একাধিক * .sql বা * .sh স্ক্রিপ্ট যুক্ত করুন (প্রয়োজনে ডিরেক্টরি তৈরি করুন)। ডিফল্ট পোস্টগ্রিজ ব্যবহারকারী এবং ডাটাবেস তৈরি করার জন্য এন্ট্রিপয়েন্টটি initdb কল করার পরে, এটি পরিষেবা শুরু করার আগে আরও সূচনা করার জন্য যে কোনও * .এসকিউএল ফাইল চালাবে এবং সেই ডিরেক্টরিতে পাওয়া কোনও * .sh স্ক্রিপ্টগুলি উত্স করবে।

সুতরাং আপনার .sql ফাইলটি অনুলিপি করার কাজ করবে।


ব্যবহারকারী / পাসওয়ার্ড এবং ডিবি তৈরির জন্য পরিবেশগত ভেরিয়েবলগুলি এখনও কাজ করে। (9.5.3)
জেরেমিয়া অ্যাডামস

1
আমার একটি প্রকল্প রয়েছে যা স্থানীয়ভাবে কাজ করে। যাইহোক, যখন আমি এডাব্লুএস ইসি 2 এ স্থানান্তর করি, তখন এটি বলে যে ডিবি খুঁজে পাওয়া যায় না। আমি যথাযথ ডিরেক্টরিতে .sql ফাইলটি অনুলিপি করি তবে এটি ত্রুটিটি ফেরত দেয়। আমি দেখতে পারে যেখানে কোন ধারণা? আমি ডকারে নতুন।
ম্যাডফিসিসিস্ট

1
এটি কেবলমাত্র সত্য যদি একক ভলিউমের সাথে আবদ্ধ একক ডিবি উদাহরণ থাকে, অর্থাত্ যদি ভলিউম ফোল্ডারে কিছু ইতিমধ্যে থাকে তবে এটি কোনও স্ক্রিপ্ট চালায় না। এটি আমার মাথা ব্যাথা দেয় কারণ আমি আমার প্রতিটি স্ট্যাক পরিষেবার জন্য আলাদা ডিবি প্রারম্ভিক পেতে চাই।
ভায়োলেট রেড

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'খুব অদ্ভুত ... আপনার ইউটিএফ 8 ব্যবহার এড়াতে খুব বিশেষ প্রয়োজন থাকতে হবে
জাইঘ

4

ব্যবহারকারী তৈরি করার আগে আপনার ডাটাবেস চালানো দরকার। এর জন্য আপনার একাধিক প্রক্রিয়া প্রয়োজন। আপনি শেল স্ক্রিপ্টের সাব-শেল (&) এ পোস্টগ্রিজ শুরু করতে পারেন, বা পোস্টগ্রিস চালানোর জন্য সুপারভাইজারের মতো একটি সরঞ্জাম ব্যবহার করতে পারেন এবং তারপরে যেকোন সূচনা স্ক্রিপ্ট চালাতে পারেন।

সুপারভাইজার এবং ডকার https://docs.docker.com/articles/used_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:
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.