রিঅ্যাক্ট ফ্রন্ট-এন্ড অ্যাপ্লিকেশনের মাধ্যমে আপনার রুবি অন রেলে ডকারাইজ করা আপনার ডেভেলপমেন্ট ওয়ার্কফ্লো এবং স্থাপনার প্রক্রিয়াকে নাটকীয়ভাবে উন্নত করতে পারে। আপনার অ্যাপের জন্য একটি প্রমিত পরিবেশ তৈরি করে, আপনি উন্নয়ন, পরীক্ষা, উৎপাদন, এমনকি বিভিন্ন সিস্টেমের বিভিন্ন পর্যায়ে সামঞ্জস্যপূর্ণ আচরণ নিশ্চিত করেন। আসলে, এটি সিস্টেমের পার্থক্য সম্পর্কিত সমস্যাগুলি কমানোর জন্য ডিজাইন করা হয়েছে। ডকার কন্টেইনারে আপনার রেল এবং প্রতিক্রিয়া অ্যাপটি সুচারুভাবে চালানোর জন্য এই নির্দেশিকাটি আপনাকে প্রয়োজনীয় পদক্ষেপের মধ্য দিয়ে নিয়ে যাবে।
যখনই আপনি আপনার অ্যাপ্লিকেশন সেট আপ এবং তৈরি করেন, নির্দিষ্ট পরিবেশ কনফিগারেশন প্রয়োজন। উদাহরণস্বরূপ, আপনার সিস্টেমে ইনস্টল করা রুবি পরিবেশ ছাড়া আপনি একটি রেল অ্যাপ্লিকেশন চালাতে পারবেন না। একইভাবে, আপনি 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
বেস ইমেজ ব্যবহার করে। এটি রুবি রানটাইম সহ ধারক সেট আপ করে। ঠিক যেমন আমি আগে উল্লেখ করেছি, একটি রেল অ্যাপ্লিকেশন চালানোর জন্য, আপনাকে রুবি ইনস্টল করতে হবে। 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
: চিত্রের আকার কমাতে প্যাকেজ তালিকা এবং ডকুমেন্টেশন সরিয়ে দেয়। RUN curl -fsSL //deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn
curl -fsSL //deb.nodesource.com/setup_current.x | bash -
: Node.js ইনস্টল করার জন্য NodeSource সেটআপ স্ক্রিপ্ট ডাউনলোড এবং রান করে।
apt-get install -y nodejs
: Node.js ইনস্টল করে।
curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
: প্যাকেজ যাচাই করতে ইয়ার্ন GPG কী যোগ করে।
echo "deb //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
: রেল এনভায়রনমেন্ট (যেমন 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/
: দ্রুত রেল অ্যাপ্লিকেশন বুট সময়ের জন্য বুটসন্যাপ ক্যাশে প্রি-কম্পাইল করে। বুটস্ন্যাপ হল একটি রত্ন যা ব্যয়বহুল কম্পিউটেশন ক্যাশ করে রুবি এবং রেলের বুট সময়কে গতি দেয়৷ 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"]
: কন্টেইনার শুরু হলে চালানোর জন্য ডিফল্ট কমান্ড নির্দিষ্ট করে, যা রেল সার্ভার শুরু করার জন্য। docker-compose.yml
ফাইলটি মাল্টি-কন্টেইনার ডকার অ্যাপ্লিকেশনগুলিকে সংজ্ঞায়িত করতে এবং চালানোর জন্য ব্যবহৃত হয়। এটি আপনাকে একটি ফাইলে আপনার অ্যাপ্লিকেশনের পরিষেবা, নেটওয়ার্ক এবং ভলিউম কনফিগার করতে দেয়। এই ক্ষেত্রে, আমরা দুটি পরিষেবা ব্যবহার করতে যাচ্ছি। এখানে 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
: এই পরিষেবার জন্য ব্যবহার করার জন্য ডকার ইমেজ নির্দিষ্ট করে। এই ক্ষেত্রে, এটি আলপাইন লিনাক্স ডিস্ট্রিবিউশনের উপর ভিত্তি করে পোস্টগ্রেএসকিউএল 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-এ অ্যাক্সেসের অনুমতি দেয়।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
স্ক্রিপ্ট এবং প্রতিটি অংশের একটি বিশদ ব্যাখ্যা রয়েছে:
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 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 //deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb //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 "${@}"