paint-brush
रिएक्ट फ्रंट-एंड ऐप के साथ रूबी और रेल्स के "डॉकराज़िशन" के लिए एक सरलीकृत गाइडद्वारा@forison
347 रीडिंग
347 रीडिंग

रिएक्ट फ्रंट-एंड ऐप के साथ रूबी और रेल्स के "डॉकराज़िशन" के लिए एक सरलीकृत गाइड

द्वारा Addo Boakye Forison13m2024/08/04
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

Dockerization में दो मुख्य अवधारणाएँ शामिल हैं: छवियाँ और कंटेनर। छवियाँ कंटेनर के लिए ब्लूप्रिंट के रूप में काम करती हैं, जिसमें कंटेनर बनाने के लिए सभी आवश्यक जानकारी होती है। कंटेनर एक छवि का रनटाइम इंस्टेंस है, जिसमें छवि स्वयं, एक निष्पादन वातावरण और रनटाइम निर्देश शामिल हैं। इस लेख में, हम आपके Rails और React एप्लिकेशन को विस्तार से Dockerize करने के लिए एक व्यावहारिक मार्गदर्शिका प्रदान करेंगे।
featured image - रिएक्ट फ्रंट-एंड ऐप के साथ रूबी और रेल्स के "डॉकराज़िशन" के लिए एक सरलीकृत गाइड
Addo Boakye Forison HackerNoon profile picture
0-item
1-item

अपने Ruby on Rails को React फ्रंट-एंड एप्लिकेशन के साथ Dockerize करने से आपके डेवलपमेंट वर्कफ़्लो और डिप्लॉयमेंट प्रक्रिया में नाटकीय रूप से सुधार हो सकता है। अपने ऐप के लिए एक मानकीकृत वातावरण बनाकर, आप विकास, परीक्षण, उत्पादन और यहां तक कि विभिन्न प्रणालियों के विभिन्न चरणों में सुसंगत व्यवहार सुनिश्चित करते हैं। वास्तव में, इसे सिस्टम अंतर से संबंधित समस्याओं को कम करने के लिए डिज़ाइन किया गया है। यह मार्गदर्शिका आपको Docker कंटेनरों में अपने Rails और React ऐप को सुचारू रूप से चलाने के लिए आवश्यक चरणों से गुज़रने में मदद करेगी।

Docker बचाव के लिए

किसी एप्लिकेशन को Dockerize क्यों करें?

  • विभिन्न वातावरणों में एकरूपता :
    • Docker यह सुनिश्चित करता है कि एप्लिकेशन उसी तरह से चले, चाहे वह किसी डेवलपर की मशीन पर हो, परीक्षण वातावरण पर हो या उत्पादन सर्वर पर हो। यह स्थिरता सभी निर्भरताओं और कॉन्फ़िगरेशन को कंटेनरीकृत करके प्राप्त की जाती है।


  • निर्भरता प्रबंधन :
    • Docker कंटेनर में एप्लिकेशन को चलाने के लिए सभी आवश्यक निर्भरताएँ शामिल होती हैं। इसका मतलब यह है कि सिस्टम लाइब्रेरी में भिन्नता या अलग-अलग सिस्टम पर निर्भरता की कमी एप्लिकेशन की कार्यक्षमता को प्रभावित नहीं करती है।


  • एकांत :
    • डॉकर कंटेनर एक दूसरे से और होस्ट सिस्टम से अलग-थलग होकर चलते हैं। यह अलगाव अलग-अलग अनुप्रयोगों और एक ही सिस्टम पर उनकी निर्भरता के बीच टकराव को रोकता है।


  • पोर्टेबिलिटी :
    • Docker कंटेनर को आसानी से किसी भी सिस्टम पर ले जाया और चलाया जा सकता है जो Docker का समर्थन करता है, चाहे वह स्थानीय मशीन हो, क्लाउड सेवा हो या समर्पित सर्वर हो। यह एप्लिकेशन को तैनाती के मामले में अत्यधिक पोर्टेबल और लचीला बनाता है।


नोट: Docker सिंटैक्स का ज्ञान आवश्यक है


डॉकराइजेशन में दो मुख्य अवधारणाएँ शामिल हैं: छवियाँ और कंटेनर। छवियाँ कंटेनर के लिए ब्लूप्रिंट के रूप में काम करती हैं, जिसमें निर्भरता और परिनियोजन कॉन्फ़िगरेशन सहित कंटेनर बनाने के लिए सभी आवश्यक जानकारी होती है। कंटेनर एक छवि का रनटाइम इंस्टेंस है, जिसमें छवि स्वयं, एक निष्पादन वातावरण और रनटाइम निर्देश शामिल हैं। सामान्य तौर पर, डॉकर शिपिंग सॉफ़्टवेयर के लिए एक मानक स्थापित करता है।


डॉकर को एक सरल उदाहरण से समझाएं: कंटेनरों को यार्ड में रखे शिपिंग कंटेनरों के रूप में सोचें, छवियों को इन कंटेनरों के अंदर रखी वस्तुओं के रूप में, तथा शिपिंग पोत को उस प्रणाली के रूप में देखें जिस पर कंटेनर चलते हैं।


जब भी आप अपना एप्लिकेशन सेट अप और बिल्ड करते हैं, तो कुछ निश्चित वातावरण कॉन्फ़िगरेशन आवश्यक होते हैं। उदाहरण के लिए, आप अपने सिस्टम पर रूबी वातावरण स्थापित किए बिना रेल्स एप्लिकेशन नहीं चला सकते। इसी तरह, आप Node.js के बिना React एप्लिकेशन नहीं चला सकते, और आप npm या Yarn आदि जैसे Node पैकेज मैनेजर के बिना React पैकेज इंस्टॉल नहीं कर सकते।


चूंकि कंटेनर उपयोगकर्ता के सिस्टम से अलग होकर चलता है, इसलिए हम इन सभी पैकेजों को अपने कंटेनर में उपलब्ध कराने जा रहे हैं, जैसा कि हम इसे सीधे अपने सिस्टम पर बनाने पर करते, इस प्रकार, कंटेनर अपने आप में एक सिस्टम के रूप में कार्य करेगा, जैसे कि एक वर्चुअल मशीन। डॉकर और वर्चुअल मशीन के बीच अंतर हैं लेकिन यह उदाहरण केवल आगे समझाने के लिए है।


अब, चलिए आगे बढ़ते हैं और Rails एप्लीकेशन को Dockerize करते हैं। ऐसा करने के लिए, हमें अपने Rails एप्लीकेशन में तीन फ़ाइलों की आवश्यकता होगी: एक Dockerfile , एक docker-compose.yml , और एक bin/docker-entrypoint । आइए इनमें से प्रत्येक फ़ाइल की विस्तार से जाँच करें।


नोट: Docker सिंटैक्स का ज्ञान आवश्यक है

डॉकरफ़ाइल

Dockerfile एक Docker कंटेनर बनाने के लिए एक खाका है। इसमें निर्देशों की एक श्रृंखला होती है जिसका उपयोग Docker एक छवि बनाने के लिए करता है, जिसका उपयोग कंटेनर चलाने के लिए किया जा सकता है। आइए Ruby on Rails और React एप्लिकेशन के लिए Dockerfile तोड़ें:

. आधार छवि

 ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION
  • ARG RUBY_VERSION=3.1.4 : RUBY_VERSION नामक बिल्ड तर्क को 3.1.4 के डिफ़ॉल्ट मान के साथ परिभाषित करता है। इसे बिल्ड समय पर ओवरराइड किया जा सकता है।


  • FROM ruby:$RUBY_VERSION : RUBY_VERSION द्वारा निर्दिष्ट संस्करण के साथ ruby बेस इमेज का उपयोग करता है। यह कंटेनर को रूबी रनटाइम के साथ सेट करता है। जैसा कि मैंने पहले बताया, Rails एप्लिकेशन चलाने के लिए, आपको रूबी इंस्टॉल करना होगा।

2. निर्भरताएं स्थापित करें

 RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man
  • apt-get update -qq : शांत आउटपुट के लिए -qq के साथ रिपॉजिटरी से पैकेज सूची को अपडेट करता है।


  • apt-get install -y ... : विभिन्न पैकेज स्थापित करता है:
    • build-essential : सॉफ्टवेयर निर्माण के लिए आवश्यक पैकेज (जैसे GCC).

    • libvips : छवि प्रसंस्करण के लिए लाइब्रेरी.

    • bash , bash-completion : Bash शेल और इसका स्वतः-पूर्णीकरण।

    • libffi-dev : विदेशी फ़ंक्शन इंटरफ़ेस लाइब्रेरी.

    • tzdata : समय क्षेत्र डेटा.

    • postgresql : PostgreSQL डेटाबेस क्लाइंट.

    • curl : यूआरएल से डेटा स्थानांतरित करने का उपकरण.


  • apt-get clean : पुनर्प्राप्त पैकेज फ़ाइलों के स्थानीय रिपॉजिटरी को साफ़ करता है।


  • rm -rf /var/lib/apt/lists/ /usr/share/doc /usr/share/man : छवि का आकार कम करने के लिए पैकेज सूची और दस्तावेज़न को हटाता है।

3. Node.js और यार्न स्थापित करें

 RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn
  • curl -fsSL https://deb.nodesource.com/setup_current.x | bash - : Node.js को स्थापित करने के लिए NodeSource सेटअप स्क्रिप्ट को डाउनलोड करता है और चलाता है।


  • apt-get install -y nodejs : Node.js स्थापित करता है.


  • curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - : अपने पैकेजों को सत्यापित करने के लिए यार्न GPG कुंजी जोड़ता है।


  • echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list : यार्न के रिपॉजिटरी को स्रोतों की सूची में जोड़ता है।


  • apt-get update && apt-get install -y yarn : पैकेज सूची को अद्यतन करता है और यार्न को स्थापित करता है।

4. पर्यावरण चर

 ENV NODE_OPTIONS=--openssl-legacy-provider
  • ENV NODE_OPTIONS=--openssl-legacy-provider : Node.js के लिए विरासत OpenSSL समर्थन को सक्षम करने के लिए एक पर्यावरण चर सेट करता है।

5. कार्य निर्देशिका सेट करें

 WORKDIR /rails
  • WORKDIR /rails : /rails पर आगामी निर्देशों के लिए कार्यशील निर्देशिका सेट करता है।

6. तर्क और पर्यावरण चर बनाएँ

 ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV
  • ARG RAILS_ENV : Rails वातावरण (जैसे development , test , production ) को निर्दिष्ट करने के लिए RAILS_ENV नामक एक बिल्ड तर्क को परिभाषित करता है।


  • ENV RAILS_ENV=$RAILS_ENV : पर्यावरण चर RAILS_ENV बिल्ड तर्क के मान पर सेट करता है।

7. एप्लीकेशन जेम्स इंस्टॉल करें

 COPY Gemfile Gemfile.lock ./ RUN bundle install
  • COPY Gemfile Gemfile.lock ./ : Gemfile और Gemfile.lock को कार्यशील निर्देशिका में कॉपी करता है।


  • RUN bundle install : Gemfile में निर्दिष्ट रूबी रत्नों को स्थापित करता है।

8. फ्रंट-एंड निर्भरताएं स्थापित करें

 COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile
  • COPY package.json yarn.lock ./ : package.json और yarn.lock को कार्यशील निर्देशिका में कॉपी करता है।


  • RUN yarn install --frozen-lockfile : यार्न का उपयोग करके फ्रंट-एंड निर्भरताएं स्थापित करता है, यह सुनिश्चित करता है कि यह yarn.lock में सटीक संस्करणों का उपयोग करता है।

9. एप्लीकेशन कोड कॉपी करें

 COPY . .
  • COPY . . : सभी अनुप्रयोग कोड को कार्यशील निर्देशिका में कॉपी करता है।

10. बूटस्नैप कोड को पूर्व-संकलित करें

 RUN bundle exec bootsnap precompile --gemfile app/ lib/
  • RUN bundle exec bootsnap precompile --gemfile app/ lib/ : Rails एप्लीकेशन के बूट समय को तेज़ करने के लिए बूटस्नैप कैश को प्री-कंपाइल करता है। बूटस्नैप एक ऐसा रत्न है जो महंगे कंप्यूटेशन को कैश करके रूबी और Rails के बूट समय को तेज़ करता है।

11. उत्पादन के लिए परिसंपत्तियों का पूर्व-संकलन

 RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi
  • RUN if [ "$RAILS_ENV" = "production" ]; then ... : सशर्त रूप से संपत्ति पूर्व-संकलन केवल तभी चलाता है जब RAILS_ENV production पर सेट किया जाता है। उत्पादन परिवेश के लिए संपत्ति तैयार करने के लिए यह चरण महत्वपूर्ण है।

12. एंट्रीपॉइंट स्क्रिप्ट

 COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint
  • COPY bin/docker-entrypoint /rails/bin/ : एक कस्टम एंट्रीपॉइंट स्क्रिप्ट को कंटेनर में कॉपी करता है।


  • RUN chmod +x /rails/bin/docker-entrypoint : एंट्रीपॉइंट स्क्रिप्ट को निष्पादन योग्य बनाता है।

13. एंट्रीपॉइंट और कमांड को परिभाषित करें

 ENTRYPOINT ["/rails/bin/docker-entrypoint"] EXPOSE 5000 // you can use any port of your choice CMD ["./bin/rails", "server"]
  • ENTRYPOINT ["/rails/bin/docker-entrypoint"] : वह एंट्रीपॉइंट स्क्रिप्ट सेट करता है जो कंटेनर के शुरू होने पर चलेगी। यह स्क्रिप्ट आम तौर पर वातावरण सेट करती है, डेटाबेस तैयार करती है, और एप्लिकेशन शुरू करती है।


  • EXPOSE 5000 : यह इंगित करता है कि कंटेनर पोर्ट 5000 पर सुनता है। यह एक दस्तावेज़ीकरण सुविधा है और पोर्ट को प्रकाशित नहीं करता है।


  • CMD ["./bin/rails", "server"] : कंटेनर प्रारंभ होने पर चलाने के लिए डिफ़ॉल्ट कमांड निर्दिष्ट करता है, जो Rails सर्वर को प्रारंभ करना है।

docker-कंपोज़.yml

docker-compose.yml फ़ाइल का उपयोग मल्टी-कंटेनर Docker एप्लिकेशन को परिभाषित करने और चलाने के लिए किया जाता है। यह आपको अपने एप्लिकेशन की सेवाओं, नेटवर्क और वॉल्यूम को एक ही फ़ाइल में कॉन्फ़िगर करने की अनुमति देता है। इस मामले में, हम दो सेवाओं का उपयोग करने जा रहे हैं। Rails एप्लिकेशन के लिए docker-compose.yml फ़ाइल यहाँ दी गई है:

1. डेटाबेस सेवा ( db )

 codedb: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432"
  • image: postgres:14.2-alpine : इस सेवा के लिए उपयोग की जाने वाली Docker छवि को निर्दिष्ट करता है। इस मामले में, यह Alpine Linux वितरण पर आधारित PostgreSQL 14.2 छवि है। Alpine छवियाँ अपने छोटे आकार के लिए जानी जाती हैं, जो समग्र छवि आकार को कम रखने में मदद कर सकती हैं।


  • container_name: demo-postgres-14.2 : कंटेनर का नाम demo-postgres-14.2 । इस नाम का उपयोग कमांड और लॉग में कंटेनर को संदर्भित करने के लिए किया जाता है।


  • volumes :
    • postgres_data:/var/lib/postgresql/data: कंटेनर के अंदर /var/lib/postgresql/data पर नामित वॉल्यूम postgres_data माउंट करता है। यह निर्देशिका वह जगह है जहाँ PostgreSQL अपना डेटा संग्रहीत करता है, यह सुनिश्चित करता है कि कंटेनर पुनरारंभ के बीच डेटाबेस डेटा बना रहे।


  • command: "postgres -c 'max_connections=500'" : PostgreSQL इमेज के डिफ़ॉल्ट कमांड को ओवरराइड करता है। यह कनेक्शन की अधिकतम संख्या को 500 तक बढ़ाने के लिए कॉन्फ़िगरेशन विकल्प के साथ PostgreSQL शुरू करता है।


  • environment :
    • POSTGRES_DB: ${POSTGRES_DB} : एक पर्यावरण चर POSTGRES_DB का उपयोग करके, बनाए जाने वाले डिफ़ॉल्ट डेटाबेस का नाम सेट करता है।

    • POSTGRES_USER: ${POSTGRES_USER} : POSTGRES_USER पर्यावरण चर का उपयोग करके PostgreSQL डेटाबेस तक पहुँचने के लिए डिफ़ॉल्ट उपयोगकर्ता नाम सेट करता है।

    • POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} : POSTGRES_PASSWORD पर्यावरण चर का उपयोग करके डिफ़ॉल्ट उपयोगकर्ता के लिए पासवर्ड सेट करता है।


  • ports :
    • "5432:5432" : होस्ट पर पोर्ट 5432 को कंटेनर में पोर्ट 5432 पर मैप करता है। यह पोर्ट 5432 के माध्यम से होस्ट मशीन पर PostgreSQL तक पहुँच की अनुमति देता है।

2. वेब एप्लिकेशन सेवा ( demo-web )

 codedemo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000"
  • build:

    • context: . : Docker छवि के लिए निर्माण संदर्भ निर्दिष्ट करता है। इस मामले में, . वर्तमान निर्देशिका को संदर्भित करता है। इसका मतलब है कि Docker छवि बनाने के लिए वर्तमान निर्देशिका में Dockerfile का उपयोग करेगा।
    • args :
      • RAILS_ENV=${RAILS_ENV} : RAILS_ENV बिल्ड तर्क को Docker बिल्ड प्रक्रिया में पास करता है, जिससे आप Rails वातावरण (जैसे development , test या production ) निर्दिष्ट कर सकते हैं।


  • command: "./bin/rails server -b 0.0.0.0" : Docker इमेज के डिफ़ॉल्ट कमांड को ओवरराइड करता है। Rails सर्वर को शुरू करता है और इसे सभी नेटवर्क इंटरफेस ( 0.0.0.0 ) से बांधता है, जो कंटेनर के बाहर से सेवा तक पहुँचने के लिए आवश्यक है।


  • environment:

    • RAILS_ENV=${RAILS_ENV} : RAILS_ENV पर्यावरण चर का उपयोग करके कंटेनर के अंदर Rails पर्यावरण सेट करता है।

    • POSTGRES_HOST=${POSTGRES_HOST} : PostgreSQL होस्ट पता सेट करता है।

    • POSTGRES_DB=${POSTGRES_DB} : डेटाबेस नाम सेट करता है.

    • POSTGRES_USER=${POSTGRES_USER} : PostgreSQL उपयोगकर्ता सेट करता है।

    • POSTGRES_PASSWORD=${POSTGRES_PASSWORD} : PostgreSQL उपयोगकर्ता पासवर्ड सेट करता है।

    • RAILS_MASTER_KEY=${RAILS_MASTER_KEY} : रेल्स मास्टर कुंजी सेट करता है, जिसका उपयोग क्रेडेंशियल्स और अन्य रहस्यों को एन्क्रिप्ट करने के लिए किया जाता है।


  • volumes :

    • .:/rails : वर्तमान निर्देशिका (जहाँ docker-compose.yml फ़ाइल स्थित है) को कंटेनर के अंदर /rails पर माउंट करता है। यह आपको अपने होस्ट पर फ़ाइलों को संपादित करने और कंटेनर के अंदर उन परिवर्तनों को दर्शाने की अनुमति देता है।

    • app-storage:/rails/storage : कंटेनर के अंदर /rails/storage पर नामित वॉल्यूम app-storage माउंट करता है। इसका उपयोग आमतौर पर Rails-विशिष्ट फ़ाइलों जैसे लॉग, अपलोड और कैश की गई फ़ाइलों को संग्रहीत करने के लिए किया जाता है।


  • depends_on :

    • db : यह सुनिश्चित करता है कि demo-web सेवा शुरू होने से पहले db सेवा के तैयार होने का इंतज़ार करे। Docker Compose इस सेटिंग के आधार पर सेवाओं को शुरू करने के क्रम को संभालता है।
  • ports:

    • "3000:3000" : होस्ट पर पोर्ट 3000 को कंटेनर में पोर्ट 3000 पर मैप करता है। यह आपको पोर्ट 3000 के माध्यम से होस्ट मशीन पर Rails एप्लिकेशन तक पहुंचने की अनुमति देता है।

    संस्करणों

     codevolumes: postgres_data: app-storage:
    • postgres_data : PostgreSQL डेटा को बनाए रखने के लिए db सेवा द्वारा उपयोग किए जाने वाले नामित वॉल्यूम postgres_data परिभाषित करता है।
    • app-storage : एक नामित वॉल्यूम app-storage को परिभाषित करता है जिसका उपयोग demo-web सेवा द्वारा एप्लिकेशन-विशिष्ट डेटा, जैसे अपलोड और लॉग को बनाए रखने के लिए किया जाता है।

बिन/डॉकर-एंट्रीपॉइंट

bin/docker-entrypoint स्क्रिप्ट डॉकर सेटअप का एक महत्वपूर्ण हिस्सा है। कंटेनर शुरू होने पर इसे निष्पादित किया जाता है, और यह आम तौर पर मुख्य एप्लिकेशन शुरू करने से पहले पर्यावरण सेटअप, डेटाबेस तैयारी और अन्य आरंभीकरण कार्यों को संभालता है। यहाँ एक उदाहरण bin/docker-entrypoint स्क्रिप्ट और प्रत्येक भाग का विस्तृत विवरण दिया गया है:

शेबैंग और त्रुटि पर बाहर निकलें

 bashCopy code#!/bin/bash set -e
  • #!/bin/bash : यह पंक्ति निर्दिष्ट करती है कि स्क्रिप्ट को Bash शेल का उपयोग करके चलाया जाना चाहिए।


  • set -e : यह स्क्रिप्ट को तुरंत बाहर निकलने का निर्देश देता है यदि कोई कमांड गैर-शून्य निकास कोड लौटाता है। यह सुनिश्चित करने में मदद करता है कि यदि कोई चरण विफल हो जाता है, तो स्क्रिप्ट निष्पादन को रोक देती है, जो बाद के चरणों को अमान्य स्थिति में चलने से रोक सकता है।


सशर्त डेटाबेस निर्माण या माइग्रेशन

 # If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi


  • if [ "${*}" == "./bin/rails server" ]; then ... fi : यह सशर्त कथन जाँचता है कि क्या स्क्रिप्ट को दिया गया आदेश ( "${*}" ) ./bin/rails server है। * एक विशेष पैरामीटर है जो स्क्रिप्ट को दिए गए सभी स्थितीय पैरामीटर रखता है।


  • ./bin/रेल्स डाटाबेस

    : यदि शर्त पूरी होती है, तो यह कमांड डेटाबेस बनाने का प्रयास करेगा। यह rails db:create के बराबर है जो डेटाबेस कॉन्फ़िगरेशन फ़ाइल ( config/database.yml ) में परिभाषित डेटाबेस को सेट करता है।


  • ./bin/रेल्स डाटाबेस

    : यह कमांड rails db:prepare चलाएगा, जो सुनिश्चित करता है कि डेटाबेस सेट अप और माइग्रेट हो गया है। यदि डेटाबेस मौजूद नहीं है तो यह डेटाबेस बनाएगा और यदि डेटाबेस पहले से बना हुआ है तो माइग्रेशन चलाएगा। यह rails db:create और rails db:migrate का संयोजन है।

    मुख्य प्रक्रिया का निष्पादन

     bashCopy codeexec "${@}"
    • exec "${@}" : यह वर्तमान शेल प्रक्रिया को स्क्रिप्ट में तर्क के रूप में पारित कमांड से बदल देता है। @ प्रतीक स्क्रिप्ट में पारित सभी स्थितीय पैरामीटर रखता है। उदाहरण के लिए, यदि स्क्रिप्ट को ./bin/rails server के साथ कॉल किया जाता है, तो यह लाइन प्रभावी रूप से ./bin/rails server कंटेनर की मुख्य प्रक्रिया के रूप में चलाती है।

निष्कर्ष

आपके रूबी ऑन रेल्स और रिएक्ट एप्लिकेशन के लिए एक विश्वसनीय और सुसंगत वातावरण बनाने के लिए एक अच्छी तरह से तैयार की गई Dockerfile आवश्यक है। बेस इमेज को परिभाषित करके, पर्यावरण चर सेट करके और निर्भरताएँ स्थापित करके, आप सुनिश्चित करते हैं कि आपका एप्लिकेशन विभिन्न वातावरणों में सुचारू रूप से चलता है।


Docker न केवल आपकी विकास प्रक्रिया को सुव्यवस्थित करता है बल्कि उत्पादन में आपके एप्लिकेशन की विश्वसनीयता को भी बढ़ाता है। अनुकूलन के क्षेत्र हैं, लेकिन यह रेल एप्लिकेशन को डॉकराइज़ करने के तरीके का एक सामान्य अवलोकन है।

परिणामी Dockerfile , docker-compose.yml और bin/docker-entrypoint के लिए पूर्ण स्क्रिप्ट

 ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION # Install dependencies RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man # Install Node.js and Yarn RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn # Set environment variable to enable legacy OpenSSL support ENV NODE_OPTIONS=--openssl-legacy-provider # Rails app lives here WORKDIR /rails # Set environment variable for the build ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV # Install application gems COPY Gemfile Gemfile.lock ./ RUN bundle install # Install frontend dependencies COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # Copy application code COPY . . # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile --gemfile app/ lib/ # Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi # Entrypoint prepares the database. COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint # Use an absolute path for the entry point script ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start the server by default, this can be overwritten at runtime EXPOSE 5000 CMD ["./bin/rails", "server"]


 services: db: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432" demo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000" volumes: postgres_data: app-storage:



 #!/bin/bash set -e # If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi exec "${@}"