paint-brush
React Front-End Uygulaması ile Ruby ve Rails'in "Dockerazition"u için Basitleştirilmiş Bir Kılavuz ile@forison
347 okumalar
347 okumalar

React Front-End Uygulaması ile Ruby ve Rails'in "Dockerazition"u için Basitleştirilmiş Bir Kılavuz

ile Addo Boakye Forison13m2024/08/04
Read on Terminal Reader

Çok uzun; Okumak

Dockerizasyon iki temel kavramı içerir: görüntüler ve kapsayıcılar. Görüntüler, 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. Bu makalede, Rails ve React uygulamalarınızı ayrıntılı olarak dockerize etmek için uygulamalı bir kılavuz sunacağız.
featured image - React Front-End Uygulaması ile Ruby ve Rails'in "Dockerazition"u için Basitleştirilmiş Bir Kılavuz
Addo Boakye Forison HackerNoon profile picture
0-item
1-item

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.

Kurtarmaya Docker

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ğeri 3.1.4 olan RUBY_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 sahip ruby 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çin RAILS_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 ve Gemfile.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 ve yarn.lock çalışma dizinine kopyalar.


  • RUN yarn install --frozen-lockfile : Yarn kullanarak ön uç bağımlılıklarını yükler ve yarn.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ızca RAILS_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çindeki postgres_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 veya production 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 birim app-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 önce db 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çin db hizmeti tarafından kullanılan postgres_data adlı adlandırılmış birimi tanımlar.
    • app-storage : Yüklemeler ve günlükler gibi uygulamaya özel verileri sürdürmek için demo-web hizmeti tarafından kullanılan adlandırılmış birim app-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 ayarlayan rails 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. Bu rails db:create ve rails 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 "${@}"