Skip to content

Instantly share code, notes, and snippets.

@ggaona
Last active February 15, 2023 00:41
Show Gist options
  • Save ggaona/becb51937c46f394014485692b6cabb7 to your computer and use it in GitHub Desktop.
Save ggaona/becb51937c46f394014485692b6cabb7 to your computer and use it in GitHub Desktop.
Rails 7, PostgreSQL, Redis on Docker (DEV setup)

Rails 7, PostgreSQL, Redis on Docker (DEV setup)

Create Rails app with docker

docker run --rm -it -v ${PWD}:/usr/src -w /usr/src ruby:3.2.1 sh -c 'gem install rails:"~>7.0.4" && rails new --database=postgresql <app_name>'

Create Docker files

  1. cd into project directory

    $ cd <app_name>
    
  2. Create bin/docker-entrypoint.sh:

    #!/bin/bash
    set -e
    
    # Remove a potentially pre-existing server.pid file.
    rm -f /usr/src/app/tmp/pids/server.pid
    
    echo "bundle install..."
    bundle check || bundle install --jobs 4
    
    # Execute container's main process (CMD in Dockerfile).
    exec "$@"
    
  3. Add Dockerfile:

    FROM ruby:3.2.1-slim
    
    RUN apt-get update -qq && apt-get install -yq --no-install-recommends \
        build-essential \
        gnupg2 \
        less \
        git \
        libpq-dev \
        postgresql-client \
        libvips \
        chromium \
      && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    ENV LANG=C.UTF-8 BUNDLE_JOBS=4 BUNDLE_RETRY=3
    
    RUN gem update --system && gem install bundler
    
    WORKDIR /usr/src/app
    
    ENTRYPOINT ["./bin/docker-entrypoint.sh"]
    
    EXPOSE 3000
    
    CMD ["bin/rails", "server", "-b", "0.0.0.0"]
    
    
  4. Add docker-compose.yml:

    services:
      app:
        build: .
        environment:
          - HISTFILE=/usr/src/app/log/.bash_history
          - PGHOST=db
          - PGUSER=postgres
          - PGPASSWORD=<db_password>
        ports:
          - 3000:3000
        volumes:
          - .:/usr/src/app
          - bundle:/usr/local/bundle
        depends_on:
          - db
          - redis
          
      db:
        image: postgres:15
        environment:
          - POSTGRES_PASSWORD=<db_password>
        ports:
          - 5432:5432
        volumes:
          - pg_data:/var/lib/postgresql/data
    
      redis:
        image: redis
        volumes:
          - redis_data:/data
          
    volumes:
      pg_data:
      redis_data:
      bundle:
  5. (Optional) Add handy bin files to access containers:

    • bin/dstart
    #!/bin/bash
    set -euo pipefail
    
    docker-compose up -d
    
    • bin/denter
    #!/bin/bash
    set -euo pipefail
    
    docker-compose exec web bash
    
    • bin/dconsole
    #!/bin/bash
    set -euo pipefail
    
    docker-compose exec web rails console
    
  6. Make added bin files executable:

    $ chmod +x d*
    

Build & start app

$ docker-compose build
$ bin/dstart

Create database

$ docker-compose exec web rails db:create
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment