রিঅ্যাক্ট ফ্রন্ট-এন্ড অ্যাপ্লিকেশনের মাধ্যমে আপনার রুবি অন রেলে ডকারাইজ করা আপনার ডেভেলপমেন্ট ওয়ার্কফ্লো এবং স্থাপনার প্রক্রিয়াকে নাটকীয়ভাবে উন্নত করতে পারে। আপনার অ্যাপের জন্য একটি প্রমিত পরিবেশ তৈরি করে, আপনি উন্নয়ন, পরীক্ষা, উৎপাদন, এমনকি বিভিন্ন সিস্টেমের বিভিন্ন পর্যায়ে সামঞ্জস্যপূর্ণ আচরণ নিশ্চিত করেন। আসলে, এটি সিস্টেমের পার্থক্য সম্পর্কিত সমস্যাগুলি কমানোর জন্য ডিজাইন করা হয়েছে। ডকার কন্টেইনারে আপনার রেল এবং প্রতিক্রিয়া অ্যাপটি সুচারুভাবে চালানোর জন্য এই নির্দেশিকাটি আপনাকে প্রয়োজনীয় পদক্ষেপের মধ্য দিয়ে নিয়ে যাবে।
কেন একটি অ্যাপ্লিকেশন Dockerize?
- পরিবেশ জুড়ে ধারাবাহিকতা :
ডকার নিশ্চিত করে যে অ্যাপ্লিকেশনটি যেখানেই মোতায়েন করা হয়েছে তা নির্বিশেষে একইভাবে চলে, বিকাশকারীর মেশিনে, একটি পরীক্ষার পরিবেশে বা একটি উত্পাদন সার্ভারে। এই ধারাবাহিকতা সমস্ত নির্ভরতা এবং কনফিগারেশন ধারণ করে অর্জন করা হয়।
- নির্ভরতা ব্যবস্থাপনা :
ডকার পাত্রে অ্যাপ্লিকেশন চালানোর জন্য সমস্ত প্রয়োজনীয় নির্ভরতা অন্তর্ভুক্ত। এর মানে হল যে সিস্টেম লাইব্রেরির ভিন্নতা বা বিভিন্ন সিস্টেমে অনুপস্থিত নির্ভরতা অ্যাপ্লিকেশনটির কার্যকারিতাকে প্রভাবিত করে না।
- আলাদা করা :
ডকার কন্টেইনার একে অপরের থেকে এবং হোস্ট সিস্টেম থেকে বিচ্ছিন্নভাবে চলে। এই বিচ্ছিন্নতা একই সিস্টেমে বিভিন্ন অ্যাপ্লিকেশন এবং তাদের নির্ভরতার মধ্যে দ্বন্দ্ব প্রতিরোধ করে।
- বহনযোগ্যতা :
- ডকার কন্টেনারগুলি সহজেই সরানো যায় এবং ডকারকে সমর্থন করে এমন যে কোনও সিস্টেমে চালানো যেতে পারে, তা স্থানীয় মেশিন, ক্লাউড পরিষেবা বা একটি ডেডিকেটেড সার্ভারই হোক না কেন। এটি অ্যাপ্লিকেশনটিকে অত্যন্ত বহনযোগ্য এবং স্থাপনার ক্ষেত্রে নমনীয় করে তোলে।
NB: ডকার সিনট্যাক্সের জ্ঞান প্রয়োজন
ডকারাইজেশনে দুটি মূল ধারণা জড়িত: চিত্র এবং ধারক। ছবিগুলি কনটেইনারগুলির জন্য ব্লুপ্রিন্ট হিসাবে কাজ করে, যেখানে নির্ভরতা এবং স্থাপনার কনফিগারেশন সহ একটি ধারক তৈরি করার জন্য প্রয়োজনীয় সমস্ত তথ্য রয়েছে। একটি ধারক হল একটি চিত্রের একটি রানটাইম দৃষ্টান্ত, যেখানে চিত্রটি নিজেই, একটি কার্যকর করার পরিবেশ এবং রানটাইম নির্দেশাবলী রয়েছে। ডকার সাধারণভাবে, শিপিং সফ্টওয়্যারের জন্য একটি মান স্থাপন করে।
ডকারকে একটি সাধারণ উপমা দিয়ে ব্যাখ্যা করতে: কন্টেইনারগুলিকে একটি ইয়ার্ডের শিপিং কন্টেইনার হিসাবে ভাবুন, এই কন্টেইনারগুলির ভিতরে রাখা আইটেমগুলি হিসাবে চিত্রগুলি এবং শিপিং জাহাজটিকে সেই সিস্টেম হিসাবে ভাবুন যার উপর কন্টেইনারগুলি চলে৷
যখনই আপনি আপনার অ্যাপ্লিকেশন সেট আপ এবং তৈরি করেন, নির্দিষ্ট পরিবেশ কনফিগারেশন প্রয়োজন। উদাহরণস্বরূপ, আপনার সিস্টেমে ইনস্টল করা রুবি পরিবেশ ছাড়া আপনি একটি রেল অ্যাপ্লিকেশন চালাতে পারবেন না। একইভাবে, আপনি Node.js
ছাড়া রিঅ্যাক্ট অ্যাপ্লিকেশন চালাতে পারবেন না, এবং আপনি npm
বা Yarn
ইত্যাদির মতো নোড প্যাকেজ ম্যানেজার ছাড়া প্রতিক্রিয়া প্যাকেজ ইনস্টল করতে পারবেন না।
যেহেতু কনটেইনারটি ব্যবহারকারীর সিস্টেম থেকে বিচ্ছিন্নভাবে চলে, তাই আমরা এই সমস্ত প্যাকেজগুলি আমাদের কন্টেইনারে উপলব্ধ করতে যাচ্ছি ঠিক যেমনটি আমরা করতাম যদি আমরা এটি সরাসরি আমাদের সিস্টেমে তৈরি করি, এইভাবে, কন্টেইনারটি এটিতে একটি সিস্টেম হিসাবে কাজ করবে। নিজের, ভার্চুয়াল মেশিনের মতো। ডকার এবং ভার্চুয়াল মেশিনের মধ্যে পার্থক্য রয়েছে তবে এই উদাহরণটি আরও ব্যাখ্যা করার জন্য।
এখন, আসুন এগিয়ে যান এবং রেল অ্যাপ্লিকেশনটিকে ডকারাইজ করি। এটি করার জন্য, আমাদের রেল অ্যাপ্লিকেশনে তিনটি ফাইলের প্রয়োজন হবে: একটি Dockerfile
, একটি docker-compose.yml
, এবং একটি bin/docker-entrypoint
। আসুন এই ফাইলগুলির প্রতিটি বিস্তারিতভাবে পরীক্ষা করি।
NB: ডকার সিনট্যাক্সের জ্ঞান প্রয়োজন
ডকারফাইল
Dockerfile
একটি ডকার কন্টেইনার তৈরি করার জন্য একটি নীলনকশা। এটিতে নির্দেশাবলীর একটি সিরিজ রয়েছে যা ডকার একটি চিত্র তৈরি করতে ব্যবহার করে, যা পরে কন্টেইনার চালানোর জন্য ব্যবহার করা যেতে পারে। আসুন একটি রুবি অন রেলের জন্য একটি Dockerfile
ভেঙে ফেলি এবং প্রতিক্রিয়া প্রয়োগ করি:
. বেস ইমেজ
ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION
-
ARG RUBY_VERSION=3.1.4
:3.1.4
ডিফল্ট মান সহRUBY_VERSION
নামের একটি বিল্ড আর্গুমেন্ট সংজ্ঞায়িত করে। এটি নির্মাণের সময় ওভাররাইড করা যেতে পারে।
-
FROM ruby:$RUBY_VERSION
:RUBY_VERSION
দ্বারা নির্দিষ্ট সংস্করণের সাথেruby
বেস ইমেজ ব্যবহার করে। এটি রুবি রানটাইম সহ ধারক সেট আপ করে। ঠিক যেমন আমি আগে উল্লেখ করেছি, একটি রেল অ্যাপ্লিকেশন চালানোর জন্য, আপনাকে রুবি ইনস্টল করতে হবে।
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
: ব্যাশ শেল এবং এর স্বয়ংক্রিয় সমাপ্তি।libffi-dev
: বিদেশী ফাংশন ইন্টারফেস লাইব্রেরি।tzdata
: সময় অঞ্চল ডেটা।postgresql
: PostgreSQL ডাটাবেস ক্লায়েন্ট।curl
: ইউআরএল থেকে ডেটা স্থানান্তর করার টুল।
-
apt-get clean
: পুনরুদ্ধার করা প্যাকেজ ফাইলগুলির স্থানীয় সংগ্রহস্থল পরিষ্কার করে।
-
rm -rf /var/lib/apt/lists/ /usr/share/doc /usr/share/man
: চিত্রের আকার কমাতে প্যাকেজ তালিকা এবং ডকুমেন্টেশন সরিয়ে দেয়।
3. Node.js এবং 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
-
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
: রেল এনভায়রনমেন্ট (যেমন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/
: দ্রুত রেল অ্যাপ্লিকেশন বুট সময়ের জন্য বুটসন্যাপ ক্যাশে প্রি-কম্পাইল করে। বুটস্ন্যাপ হল একটি রত্ন যা ব্যয়বহুল কম্পিউটেশন ক্যাশ করে রুবি এবং রেলের বুট সময়কে গতি দেয়৷
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"]
: কন্টেইনার শুরু হলে চালানোর জন্য ডিফল্ট কমান্ড নির্দিষ্ট করে, যা রেল সার্ভার শুরু করার জন্য।
docker-compose.yml
docker-compose.yml
ফাইলটি মাল্টি-কন্টেইনার ডকার অ্যাপ্লিকেশনগুলিকে সংজ্ঞায়িত করতে এবং চালানোর জন্য ব্যবহৃত হয়। এটি আপনাকে একটি ফাইলে আপনার অ্যাপ্লিকেশনের পরিষেবা, নেটওয়ার্ক এবং ভলিউম কনফিগার করতে দেয়। এই ক্ষেত্রে, আমরা দুটি পরিষেবা ব্যবহার করতে যাচ্ছি। এখানে 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
: এই পরিষেবার জন্য ব্যবহার করার জন্য ডকার ইমেজ নির্দিষ্ট করে। এই ক্ষেত্রে, এটি আলপাইন লিনাক্স ডিস্ট্রিবিউশনের উপর ভিত্তি করে পোস্টগ্রেএসকিউএল 14.2 ইমেজ। আলপাইন চিত্রগুলি তাদের ছোট আকারের জন্য পরিচিত, যা সামগ্রিক চিত্রের আকারকে কম রাখতে সাহায্য করতে পারে।
-
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: .
: ডকার ইমেজের জন্য বিল্ড প্রসঙ্গ নির্দিষ্ট করে। এক্ষেত্রে,.
বর্তমান ডিরেক্টরি বোঝায়। এর মানে ডকার ইমেজ তৈরি করতে বর্তমান ডিরেক্টরিতে ডকারফাইল ব্যবহার করবে। -
args
:RAILS_ENV=${RAILS_ENV}
: ডকার বিল্ড প্রক্রিয়াতেRAILS_ENV
বিল্ড আর্গুমেন্ট পাস করে, যা আপনাকে রেলের পরিবেশ (যেমনdevelopment
,test
বাproduction
) নির্দিষ্ট করতে দেয়।
-
command: "./bin/rails server -b 0.0.0.0"
: ডকার ইমেজের ডিফল্ট কমান্ড ওভাররাইড করে। রেল সার্ভারটি শুরু করে এবং এটিকে সমস্ত নেটওয়ার্ক ইন্টারফেসের সাথে আবদ্ধ করে (0.0.0.0
), যা পরিষেবাটি কন্টেইনারের বাইরে থেকে অ্যাক্সেসযোগ্য হওয়ার জন্য প্রয়োজনীয়৷
environment:
RAILS_ENV=${RAILS_ENV}
:RAILS_ENV
এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে কন্টেইনারের ভিতরে রেলের পরিবেশ সেট করে।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
মাউন্ট করে। এটি সাধারণত রেল-নির্দিষ্ট ফাইল যেমন লগ, আপলোড এবং ক্যাশে করা ফাইল সংরক্ষণের জন্য ব্যবহৃত হয়।
depends_on
:-
db
: নিশ্চিত করে যেdemo-web
পরিষেবাটি শুরু করার আগেdb
পরিষেবা প্রস্তুত হওয়ার জন্য অপেক্ষা করে। ডকার কম্পোজ এই সেটিং এর উপর ভিত্তি করে পরিষেবা শুরু করার ক্রম পরিচালনা করে।
-
ports:
-
"3000:3000"
: হোস্টে ম্যাপ পোর্ট 3000 থেকে পোর্ট 3000 কনটেইনারে। এটি আপনাকে পোর্ট 3000 এর মাধ্যমে হোস্ট মেশিনে রেল অ্যাপ্লিকেশন অ্যাক্সেস করতে দেয়।
ভলিউম
codevolumes: postgres_data: app-storage:
-
postgres_data
: পোস্টগ্রেএসকিউএল ডেটা বজায় রাখতেdb
পরিষেবা দ্বারা ব্যবহৃত একটি নামযুক্ত ভলিউমpostgres_data
সংজ্ঞায়িত করে। -
app-storage
: অ্যাপ-নির্দিষ্ট ডেটা, যেমন আপলোড এবং লগগুলি বজায় রাখতেdemo-web
পরিষেবা দ্বারা ব্যবহৃত একটি নামযুক্ত ভলিউমapp-storage
সংজ্ঞায়িত করে।
-
বিন/ডকার-এন্ট্রিপয়েন্ট
bin/docker-entrypoint
স্ক্রিপ্ট ডকার সেটআপের একটি গুরুত্বপূর্ণ অংশ। ধারকটি শুরু হলে এটি কার্যকর করা হয় এবং এটি সাধারণত প্রধান অ্যাপ্লিকেশন শুরু করার আগে প্রয়োজনীয় পরিবেশ সেটআপ, ডাটাবেস প্রস্তুতি এবং অন্যান্য প্রাথমিক কাজগুলি পরিচালনা করে। এখানে একটি উদাহরণ bin/docker-entrypoint
স্ক্রিপ্ট এবং প্রতিটি অংশের একটি বিশদ ব্যাখ্যা রয়েছে:
Shebang এবং ত্রুটি থেকে প্রস্থান করুন
bashCopy code#!/bin/bash set -e
-
#!/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
- যদি [ "${*}" == "./bin/rails সার্ভার" ]; তারপর ... fi : এই শর্তসাপেক্ষ বিবৃতিটি পরীক্ষা করে যে স্ক্রিপ্টে (
"${*}"
) কমান্ডটি./bin/rails server
পাঠানো হয়েছে কিনা।*
একটি বিশেষ প্যারামিটার যা স্ক্রিপ্টে পাস করা সমস্ত অবস্থানগত পরামিতি ধারণ করে।
./bin/rails db
: শর্ত পূরণ হলে, এই কমান্ড ডাটাবেস তৈরি করার চেষ্টা করবে। এটি চলমান
rails db:create
যা ডাটাবেস কনফিগারেশন ফাইলে (config/database.yml
) সংজ্ঞায়িত হিসাবে ডেটাবেস সেট আপ করে।
./bin/rails db
: এই কমান্ডটি
rails db:prepare
চালাবে, যা নিশ্চিত করে যে ডাটাবেস সেট আপ এবং স্থানান্তরিত হয়েছে। এটি ডাটাবেস তৈরি করবে যদি এটি বিদ্যমান না থাকে এবং যদি ডাটাবেসটি ইতিমধ্যে তৈরি করা থাকে তবে মাইগ্রেশন চালাবে। এটিrails db:create
এবংrails db:migrate
এর সংমিশ্রণ।মূল প্রক্রিয়া নির্বাহ করা
bashCopy codeexec "${@}"
-
exec "${@}"
: এটি স্ক্রিপ্টে আর্গুমেন্ট হিসাবে পাস করা কমান্ডের সাথে বর্তমান শেল প্রক্রিয়াটিকে প্রতিস্থাপন করে।@
প্রতীকটি স্ক্রিপ্টে পাস করা সমস্ত অবস্থানগত পরামিতি ধারণ করে। উদাহরণস্বরূপ, যদি./bin/rails server
সাথে স্ক্রিপ্টটি কল করা হয়, তাহলে এই লাইনটি কার্যকরভাবে./bin/rails server
ধারকটির প্রধান প্রক্রিয়া হিসাবে চালায়।
-
উপসংহার
আপনার রুবি অন রেল এবং রিঅ্যাক্ট অ্যাপ্লিকেশানের জন্য একটি নির্ভরযোগ্য এবং সামঞ্জস্যপূর্ণ পরিবেশ তৈরি করার জন্য একটি ভালভাবে তৈরি Dockerfile
অপরিহার্য। বেস ইমেজ সংজ্ঞায়িত করে, এনভায়রনমেন্ট ভেরিয়েবল সেট করে এবং নির্ভরতা ইনস্টল করে, আপনি নিশ্চিত করেন যে আপনার অ্যাপ্লিকেশন বিভিন্ন পরিবেশে মসৃণভাবে চলছে।
ডকার শুধুমাত্র আপনার উন্নয়ন প্রক্রিয়াকে স্ট্রীমলাইন করে না বরং উৎপাদনে আপনার আবেদনের নির্ভরযোগ্যতাও বাড়ায়। অপ্টিমাইজেশানের ক্ষেত্র রয়েছে, তবে এটি রেল অ্যাপ্লিকেশনটিকে কীভাবে ডকারাইজ করা যায় তার একটি সাধারণ ওভারভিউ।
ফলাফলের 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 "${@}"