अपने Ruby on Rails को React फ्रंट-एंड एप्लिकेशन के साथ Dockerize करने से आपके डेवलपमेंट वर्कफ़्लो और डिप्लॉयमेंट प्रक्रिया में नाटकीय रूप से सुधार हो सकता है। अपने ऐप के लिए एक मानकीकृत वातावरण बनाकर, आप विकास, परीक्षण, उत्पादन और यहां तक कि विभिन्न प्रणालियों के विभिन्न चरणों में सुसंगत व्यवहार सुनिश्चित करते हैं। वास्तव में, इसे सिस्टम अंतर से संबंधित समस्याओं को कम करने के लिए डिज़ाइन किया गया है। यह मार्गदर्शिका आपको Docker कंटेनरों में अपने Rails और React ऐप को सुचारू रूप से चलाने के लिए आवश्यक चरणों से गुज़रने में मदद करेगी।
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 एप्लिकेशन चलाने के लिए, आपको रूबी इंस्टॉल करना होगा। 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
: छवि का आकार कम करने के लिए पैकेज सूची और दस्तावेज़न को हटाता है। 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
: पैकेज सूची को अद्यतन करता है और यार्न को स्थापित करता है। ENV NODE_OPTIONS=--openssl-legacy-provider
ENV NODE_OPTIONS=--openssl-legacy-provider
: Node.js के लिए विरासत OpenSSL समर्थन को सक्षम करने के लिए एक पर्यावरण चर सेट करता है। WORKDIR /rails
WORKDIR /rails
: /rails
पर आगामी निर्देशों के लिए कार्यशील निर्देशिका सेट करता है। ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV
ARG RAILS_ENV
: Rails वातावरण (जैसे development
, test
, production
) को निर्दिष्ट करने के लिए RAILS_ENV
नामक एक बिल्ड तर्क को परिभाषित करता है।
ENV RAILS_ENV=$RAILS_ENV
: पर्यावरण चर RAILS_ENV
बिल्ड तर्क के मान पर सेट करता है। COPY Gemfile Gemfile.lock ./ RUN bundle install
COPY Gemfile Gemfile.lock ./
: Gemfile
और Gemfile.lock
को कार्यशील निर्देशिका में कॉपी करता है।
RUN bundle install
: Gemfile
में निर्दिष्ट रूबी रत्नों को स्थापित करता है। 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
में सटीक संस्करणों का उपयोग करता है। COPY . .
COPY . .
: सभी अनुप्रयोग कोड को कार्यशील निर्देशिका में कॉपी करता है। RUN bundle exec bootsnap precompile --gemfile app/ lib/
RUN bundle exec bootsnap precompile --gemfile app/ lib/
: Rails एप्लीकेशन के बूट समय को तेज़ करने के लिए बूटस्नैप कैश को प्री-कंपाइल करता है। बूटस्नैप एक ऐसा रत्न है जो महंगे कंप्यूटेशन को कैश करके रूबी और Rails के बूट समय को तेज़ करता है। RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi
RUN if [ "$RAILS_ENV" = "production" ]; then
... : सशर्त रूप से संपत्ति पूर्व-संकलन केवल तभी चलाता है जब RAILS_ENV
production
पर सेट किया जाता है। उत्पादन परिवेश के लिए संपत्ति तैयार करने के लिए यह चरण महत्वपूर्ण है। 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
: एंट्रीपॉइंट स्क्रिप्ट को निष्पादन योग्य बनाता है। 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-compose.yml
फ़ाइल का उपयोग मल्टी-कंटेनर Docker एप्लिकेशन को परिभाषित करने और चलाने के लिए किया जाता है। यह आपको अपने एप्लिकेशन की सेवाओं, नेटवर्क और वॉल्यूम को एक ही फ़ाइल में कॉन्फ़िगर करने की अनुमति देता है। इस मामले में, हम दो सेवाओं का उपयोग करने जा रहे हैं। Rails एप्लिकेशन के लिए docker-compose.yml
फ़ाइल यहाँ दी गई है:
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 तक पहुँच की अनुमति देता है।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
"${*}"
) ./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 "${@}"