Ruby on Rails'inizi bir React ön uç uygulamasıyla Docker'lamak, geliştirme iş akışınızı ve dağıtım sürecinizi önemli ölçüde iyileştirebilir. Uygulamanız için standartlaştırılmış bir ortam oluşturarak farklı geliştirme, test, üretim aşamalarında ve hatta farklı sistemlerde tutarlı davranış sağlarsınız. Aslında sistem farklılıklarıyla ilgili sorunları en aza indirmek için tasarlanmıştır. Bu kılavuz, Rails ve React uygulamanızın Docker konteynerlerinde sorunsuz çalışmasını sağlamak için gerekli adımlarda size yol gösterecektir.
Bir Uygulamayı Neden Dockerize Etmelisiniz?
- Ortamlar Arasında Tutarlılık :
Docker, uygulamanın nerede konuşlandırıldığına (bir geliştiricinin makinesinde, bir test ortamında veya bir üretim sunucusunda) bakılmaksızın aynı şekilde çalışmasını sağlar. Bu tutarlılık, tüm bağımlılıkların ve konfigürasyonların kapsayıcı hale getirilmesiyle elde edilir.
- Bağımlılık Yönetimi :
Docker kapsayıcıları, uygulamanın çalışması için gerekli tüm bağımlılıkları içerir. Bu, sistem kitaplıklarındaki değişikliklerin veya farklı sistemlerdeki eksik bağımlılıkların uygulamanın işlevselliğini etkilemediği anlamına gelir.
- İzolasyon :
Docker konteynerleri birbirlerinden ve ana sistemden yalıtılmış olarak çalışır. Bu izolasyon, farklı uygulamalar arasındaki çakışmaları ve bunların aynı sisteme bağımlılıklarını önler.
- Taşınabilirlik :
- Docker kapsayıcıları, ister yerel bir makine, ister bir bulut hizmeti veya özel bir sunucu olsun, Docker'ı destekleyen herhangi bir sistemde kolayca taşınabilir ve çalıştırılabilir. Bu, uygulamayı dağıtım açısından son derece taşınabilir ve esnek hale getirir.
Not: Docker sözdizimi bilgisi gereklidir
Dockerizasyon iki temel kavramı içerir: görüntüler ve kapsayıcılar. Görüntüler, bağımlılıklar ve dağıtım yapılandırmaları da dahil olmak üzere bir kapsayıcı oluşturmak için gerekli tüm bilgileri içeren kapsayıcılar için plan görevi görür. Konteyner, görüntünün kendisinden, yürütme ortamından ve çalışma zamanı talimatlarından oluşan bir görüntünün çalışma zamanı örneğidir. Docker genel olarak nakliye yazılımı için bir standart oluşturur.
Docker'ı basit bir benzetmeyle açıklamak gerekirse; konteynerleri bir avludaki nakliye konteynerleri, görselleri bu konteynerlerin içine yerleştirilen öğeler ve nakliye gemisini ise konteynerlerin üzerinde çalıştığı sistem olarak düşünün.
Uygulamanızı kurup oluşturduğunuzda belirli ortam yapılandırmaları gereklidir. Örneğin, sisteminizde Ruby ortamı kurulu olmadan bir Rails uygulamasını çalıştıramazsınız. Benzer şekilde, Node.js
olmadan bir React uygulamasını çalıştıramazsınız ve npm
veya Yarn
vb. gibi bir Node paket yöneticisi olmadan React paketlerini kuramazsınız.
Container, kullanıcının sisteminden izole olarak çalıştığı için, tüm bu paketleri tıpkı doğrudan sistemimiz üzerine kurduğumuzda yaptığımız gibi, Container'ımızda kullanılabilir hale getireceğiz, böylece Container, onun üzerinde bir sistem gibi hareket edecek. sanal bir makine gibi kendinize ait. Docker ve sanal makine arasında farklar vardır ancak bu örnek sadece daha fazla açıklama amaçlıdır.
Şimdi devam edelim ve Rails uygulamasını dockerize edelim. Bunu yapmak için Rails uygulamamızda üç dosyaya ihtiyacımız olacak: Dockerfile
, docker-compose.yml
ve bin/docker-entrypoint
. Bu dosyaların her birini ayrıntılı olarak inceleyelim.
Not: Docker sözdizimi bilgisi gereklidir
Docker dosyası
Dockerfile
Docker kapsayıcısı oluşturmaya yönelik bir plandır. Docker'ın bir görüntü oluşturmak için kullandığı ve daha sonra kapsayıcıları çalıştırmak için kullanılabilecek bir dizi talimat içerir. Ruby on Rails ve React uygulaması için Dockerfile
parçalara ayıralım:
. Temel Resim
ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION
-
ARG RUBY_VERSION=3.1.4
: Varsayılan değeri3.1.4
olanRUBY_VERSION
adlı bir yapı bağımsız değişkenini tanımlar. Bu, derleme sırasında geçersiz kılınabilir.
-
FROM ruby:$RUBY_VERSION
:RUBY_VERSION
tarafından belirtilen sürüme sahipruby
temel görüntüsünü kullanır. Bu, kabı Ruby çalışma zamanı ile ayarlar. Daha önce de belirttiğim gibi Rails uygulamasını çalıştırmak için Ruby'nin kurulu olması gerekir.
2. Bağımlılıkları Kurun
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
: Depolardaki paket listesini, sessiz çıktı için-qq
ile günceller.
-
apt-get install -y
... : Çeşitli paketleri yükler:build-essential
: Yazılım oluşturmak için gerekli paketler (GCC gibi).libvips
: Görüntü işleme için kütüphane.bash
,bash-completion
: Bash kabuğu ve otomatik tamamlaması.libffi-dev
: Yabancı İşlev Arayüzü kitaplığı.tzdata
: Saat dilimi verileri.postgresql
: PostgreSQL veritabanı istemcisi.curl
: URL'lerden veri aktarma aracı.
-
apt-get clean
: Alınan paket dosyalarının yerel deposunu temizler.
-
rm -rf /var/lib/apt/lists/ /usr/share/doc /usr/share/man
: Görüntü boyutunu küçültmek için paket listelerini ve belgeleri kaldırır.
3. Node.js ve Yarn'ı yükleyin
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'yi yüklemek için NodeSource kurulum komut dosyasını indirir ve çalıştırır.
-
apt-get install -y nodejs
: Node.js'yi yükler.
-
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
: Paketlerini doğrulamak için Yarn GPG anahtarını ekler.
-
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
: Yarn'ın deposunu kaynaklar listesine ekler.
-
apt-get update && apt-get install -y yarn
: Paket listesini günceller ve Yarn'ı yükler.
4. Ortam Değişkenleri
ENV NODE_OPTIONS=--openssl-legacy-provider
-
ENV NODE_OPTIONS=--openssl-legacy-provider
: Node.js için eski OpenSSL desteğini etkinleştirmek üzere bir ortam değişkeni ayarlar.
5. Çalışma Dizinini Ayarlayın
WORKDIR /rails
-
WORKDIR /rails
: Sonraki talimatlar için çalışma dizinini/rails
olarak ayarlar.
6. Argümanlar ve Ortam Değişkenleri Oluşturun
ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV
-
ARG RAILS_ENV
: Rails ortamını (development
,test
,production
gibi) belirtmek içinRAILS_ENV
adlı bir yapı bağımsız değişkenini tanımlar.
-
ENV RAILS_ENV=$RAILS_ENV
:RAILS_ENV
ortam değişkenini yapı bağımsız değişkeninin değerine ayarlar.
7. Application Gems'i yükleyin
COPY Gemfile Gemfile.lock ./ RUN bundle install
-
COPY Gemfile Gemfile.lock ./
:Gemfile
veGemfile.lock
çalışma dizinine kopyalar.
-
RUN bundle install
:Gemfile
belirtilen Ruby gem'lerini yükler.
8. Ön Uç Bağımlılıklarını Kurun
COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile
-
COPY package.json yarn.lock ./
:package.json
veyarn.lock
çalışma dizinine kopyalar.
-
RUN yarn install --frozen-lockfile
: Yarn kullanarak ön uç bağımlılıklarını yükler veyarn.lock
tam sürümleri kullanmasını sağlar.
9. Uygulama Kodunu Kopyalayın
COPY . .
-
COPY . .
: Tüm uygulama kodunu çalışma dizinine kopyalar.
10. Bootsnap Kodunu Ön Derleme
RUN bundle exec bootsnap precompile --gemfile app/ lib/
-
RUN bundle exec bootsnap precompile --gemfile app/ lib/
: Daha hızlı Rails uygulaması önyükleme süreleri için Bootsnap önbelleğini önceden derler. Bootsnap, pahalı hesaplamaları önbelleğe alarak Ruby ve Rails'in önyükleme sürelerini hızlandıran bir mücevherdir.
11. Üretim için Varlıkların Ön Derlenmesi
RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi
-
RUN if [ "$RAILS_ENV" = "production" ]; then
... : YalnızcaRAILS_ENV
production
olarak ayarlandığında koşullu olarak varlık ön derlemesini çalıştırır. Bu adım, varlıkları üretim ortamına hazırlamak için çok önemlidir.
12. Giriş Noktası Komut Dosyası
COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint
-
COPY bin/docker-entrypoint /rails/bin/
: Özel bir giriş noktası komut dosyasını konteynere kopyalar.
-
RUN chmod +x /rails/bin/docker-entrypoint
: Giriş noktası betiğini çalıştırılabilir hale getirir.
13. Giriş Noktasını ve Komutu Tanımlayın
ENTRYPOINT ["/rails/bin/docker-entrypoint"] EXPOSE 5000 // you can use any port of your choice CMD ["./bin/rails", "server"]
-
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
: Konteyner başlatıldığında çalışacak giriş noktası komut dosyasını ayarlar. Bu komut dosyası genellikle ortamı ayarlar, veritabanını hazırlar ve uygulamayı başlatır.
-
EXPOSE 5000
: Kabın 5000 numaralı bağlantı noktasını dinlediğini belirtir. Bu bir belgeleme özelliğidir ve bağlantı noktasını yayınlamaz.
-
CMD ["./bin/rails", "server"]
: Container başlatıldığında çalıştırılacak varsayılan komutu belirtir; bu, Rails sunucusunu başlatır.
docker-compose.yml
docker-compose.yml
dosyası, çok kapsayıcılı Docker uygulamalarını tanımlamak ve çalıştırmak için kullanılır. Uygulamanızın hizmetlerini, ağlarını ve birimlerini tek bir dosyada yapılandırmanıza olanak tanır. Bu durumda iki servis kullanacağız. Rails uygulaması için docker-compose.yml
dosyası:
1. Veritabanı Hizmeti ( 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
: Bu hizmet için kullanılacak Docker görüntüsünü belirtir. Bu durumda, Alpine Linux dağıtımını temel alan PostgreSQL 14.2 görüntüsüdür. Alp görüntüleri, genel görüntü boyutunun küçük tutulmasına yardımcı olabilecek küçük boyutlarıyla bilinir.
-
container_name: demo-postgres-14.2
: Container'ıdemo-postgres-14.2
adlandırır. Bu ad, komutlarda ve günlüklerde kapsayıcıya başvuruda bulunmak için kullanılır.
-
volumes
:postgres_data:/var/lib/postgresql/data:
Kabın içindekipostgres_data
adlı bir birimi/var/lib/postgresql/data
bağlar. Bu dizin, PostgreSQL'in verilerini depoladığı yerdir ve konteyner yeniden başlatmaları arasında veritabanı verilerinin korunmasını sağlar.
-
command: "postgres -c 'max_connections=500'"
: PostgreSQL görüntüsünün varsayılan komutunu geçersiz kılar. Maksimum bağlantı sayısını 500'e çıkarmak için PostgreSQL'i bir yapılandırma seçeneğiyle başlatır.
-
environment
:POSTGRES_DB: ${POSTGRES_DB}
:POSTGRES_DB
ortam değişkenini kullanarak oluşturulacak varsayılan veritabanının adını ayarlar.POSTGRES_USER: ${POSTGRES_USER}
:POSTGRES_USER
ortam değişkenini kullanarak PostgreSQL veritabanına erişim için varsayılan kullanıcı adını ayarlar.POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
:POSTGRES_PASSWORD
ortam değişkenini kullanarak varsayılan kullanıcı için parolayı ayarlar.
-
ports
:-
"5432:5432"
: Ana bilgisayardaki 5432 numaralı bağlantı noktasını kapsayıcıdaki 5432 numaralı bağlantı noktasıyla eşler. Bu, ana makinedeki PostgreSQL'e 5432 numaralı bağlantı noktası aracılığıyla erişime izin verir.
-
2. Web Uygulama Hizmeti ( 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 görüntüsünün derleme bağlamını belirtir. Bu durumda,.
geçerli dizini ifade eder. Bu, Docker'ın görüntüyü oluşturmak için geçerli dizindeki Docker dosyasını kullanacağı anlamına gelir. -
args
:RAILS_ENV=${RAILS_ENV}
:RAILS_ENV
derleme bağımsız değişkenini Docker derleme sürecine ileterek Rails ortamını (development
,test
veyaproduction
gibi) belirtmenize olanak tanır.
-
command: "./bin/rails server -b 0.0.0.0"
: Docker görüntüsünün varsayılan komutunu geçersiz kılar. Rails sunucusunu başlatır ve hizmetin konteynerin dışından erişilebilir olması için gerekli olan tüm ağ arayüzlerine (0.0.0.0
) bağlar.
environment:
RAILS_ENV=${RAILS_ENV}
:RAILS_ENV
ortam değişkenini kullanarak konteynerin içindeki Rails ortamını ayarlar.POSTGRES_HOST=${POSTGRES_HOST}
: PostgreSQL ana bilgisayar adresini ayarlar.POSTGRES_DB=${POSTGRES_DB}
: Veritabanı adını ayarlar.POSTGRES_USER=${POSTGRES_USER}
: PostgreSQL kullanıcısını ayarlar.POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
: PostgreSQL kullanıcı şifresini ayarlar.RAILS_MASTER_KEY=${RAILS_MASTER_KEY}
: Kimlik bilgilerini ve diğer sırları şifrelemek için kullanılan Rails ana anahtarını ayarlar.
volumes
:.:/rails
: Geçerli dizini (docker-compose.yml
dosyasının bulunduğu yer) konteynerin içindeki/rails
dizinine bağlar. Bu, ana makinenizdeki dosyaları düzenlemenize ve bu değişikliklerin kapsayıcının içine yansıtılmasına olanak tanır.app-storage:/rails/storage
: Adlandırılmış bir birimapp-storage
alanını konteynerin içindeki/rails/storage
bağlar. Bu genellikle günlükler, yüklemeler ve önbelleğe alınmış dosyalar gibi Rails'e özgü dosyaları depolamak için kullanılır.
depends_on
:-
db
:demo-web
hizmetinin başlamadan öncedb
hizmetinin hazır olmasını beklemesini sağlar. Docker Compose, hizmetlerin başlatılması sırasını bu ayara göre yönetir.
-
ports:
-
"3000:3000"
: Ana bilgisayardaki 3000 numaralı bağlantı noktasını kapsayıcıdaki 3000 numaralı bağlantı noktasıyla eşler. Bu, ana makinedeki Rails uygulamasına 3000 numaralı bağlantı noktası üzerinden erişmenizi sağlar.
Birimler
codevolumes: postgres_data: app-storage:
-
postgres_data
: PostgreSQL verilerini sürdürmek içindb
hizmeti tarafından kullanılanpostgres_data
adlı adlandırılmış birimi tanımlar. -
app-storage
: Yüklemeler ve günlükler gibi uygulamaya özel verileri sürdürmek içindemo-web
hizmeti tarafından kullanılan adlandırılmış birimapp-storage
tanımlar.
-
bin/docker-giriş noktası
bin/docker-entrypoint
betiği, Docker kurulumunun çok önemli bir parçasıdır. Kap başlatıldığında yürütülür ve genellikle ortam kurulumunu, veritabanı hazırlığını ve ana uygulamayı başlatmadan önce gereken diğer başlatma görevlerini yerine getirir. Aşağıda örnek bir bin/docker-entrypoint
betiği ve her parçanın ayrıntılı bir açıklaması verilmiştir:
Shebang ve Hata Durumunda Çıkış
bashCopy code#!/bin/bash set -e
-
#!/bin/bash
: Bu satır, betiğin Bash kabuğu kullanılarak çalıştırılması gerektiğini belirtir.
-
set -e
: Bu, herhangi bir komutun sıfırdan farklı bir çıkış kodu döndürmesi durumunda komut dosyasına hemen çıkması talimatını verir. Bu, herhangi bir adımın başarısız olması durumunda komut dosyasının yürütmeyi durdurmasını sağlamaya yardımcı olur ve bu da sonraki adımların geçersiz bir durumda çalışmasını önleyebilir.
Koşullu Veritabanı Oluşturma veya Taşıma
# 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 sunucusu" ]; Then ... fi : Bu koşullu ifade, betiğe (
"${*}"
) iletilen komutun./bin/rails server
olup olmadığını kontrol eder.*
betiğe iletilen tüm konumsal parametreleri tutan özel bir parametredir.
./bin/Rails db
: Koşul karşılanırsa bu komut veritabanını oluşturmaya çalışacaktır. Veritabanını, veritabanı yapılandırma dosyasında (
config/database.yml
) tanımlandığı şekilde ayarlayanrails db:create
çalıştırmaya eşdeğerdir.
./bin/Rails db
: Bu komut, veritabanının kurulmasını ve taşınmasını sağlayan
rails db:prepare
komutunu çalıştıracaktır. Eğer mevcut değilse veritabanını oluşturacak ve veritabanı zaten oluşturulmuşsa geçişleri çalıştıracaktır. Burails db:create
verails db:migrate
öğelerinin birleşimidir.Ana Sürecin Yürütülmesi
bashCopy codeexec "${@}"
-
exec "${@}"
: Bu, mevcut kabuk işlemini, betiğe argüman olarak iletilen komutla değiştirir.@
sembolü, betiğe aktarılan tüm konumsal parametreleri tutar. Örneğin, komut dosyası./bin/rails server
ile çağrılırsa, bu satır, konteynerin ana işlemi olarak./bin/rails server
etkili bir şekilde çalıştırır.
-
Çözüm
İyi hazırlanmış bir Dockerfile
Ruby on Rails ve React uygulamanız için güvenilir ve tutarlı bir ortam oluşturmak açısından çok önemlidir. Temel görüntüyü tanımlayarak, ortam değişkenlerini ayarlayarak ve bağımlılıkları yükleyerek uygulamanızın çeşitli ortamlarda sorunsuz çalışmasını sağlarsınız.
Docker yalnızca geliştirme sürecinizi kolaylaştırmakla kalmaz, aynı zamanda üretimdeki uygulamanızın güvenilirliğini de artırır. Optimizasyon alanları mevcut ancak bu, Rails uygulamasının nasıl dockerize edileceğine dair genel bir bakış.
Ortaya Çıkan Dockerfile
, docker-compose.yml
ve bin/docker-entrypoint
için Tam Komut Dosyası
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 "${@}"