Creare la directory dell'applicazione

Copiare i template di Docker all'interno della directory del progetto

 a. (Dockerfile)
FROM ruby:2.5.3

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev apt-transport-https

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && \
    apt-get install -y nodejs
RUN 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 -qq && \
    apt-get install -y yarn

WORKDIR /web

RUN useradd -u 1000 -Um rails && \
    chown -R rails:rails /web
USER rails
  b. (docker-compose.yml)
version: "3.2"

services:
  web:
    build: .
    environment:
      - WEBPACKER_DEV_SERVER_HOST=webpacker
    command: ["rails", "server", "-b", "0.0.0.0"]
    ports:
      - 3000:3000
    volumes:
      - .:/web
      - gem_bundle:/usr/local/bundle
Copiati i template procedere da terminale (all'interno della directory del nostro progetto cd myapp/) eseguendo
~/myapp> docker-compose build
Al termine dell'installazione entrare nel container
~/myapp> docker-compose run --rm web bash
Installare dall'interno del container rails
:/web$ gem install rails
Uscire dalla directory web del container (cd ..) ed eseguire il comando
:/web$ cd ..
:/$ rails new web
Volendo utilizzare mysql al posto di sqlite impostato di default:

Sostituire la gemma sqlite con mysql2 nel Gemfile ed aggiungere al docker-compose.yml
version: "3.2"

services:
  web:
    build: .
    environment:
      - WEBPACKER_DEV_SERVER_HOST=webpacker
    command: ["rails", "server", "-b", "0.0.0.0"]
    ports:
      - 3000:3000
    volumes:
      - .:/web
      - gem_bundle:/usr/local/bundle
  db:
    image: mysql:5.7.25
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD="yes"
    ports:
      - 3306:3306
    volumes:
      - db_data:/var/lib/mysql
Configurare quindi il nuovo db in database.yml come segue
default: &default
  adapter: mysql2
  host: db
  user: root
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: myapp-dev

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: myapp-test

production:
  <<: *default
  database: myapp-prod
Procedere all'installazione della nuova gemma
~/myapp> docker-compose run --rm web bundle
Terminata l'installazione della gemma, per creare le immagini del nuovo database, eseguire il comando
~/myapp> docker-compose up -d
Quindi si possono creare i db da dentro il container (docker-compose exec web bash) eseguendo
:/web$ rails db:create
Per installare webpacker:

Aggiungere al Gemfile webpacker
group :development do
  ...
  gem 'webpacker'
end
Modificare dunque il docker-compose.yml
version: "3.2"

services:
  web:
    build: .
    environment:
      - WEBPACKER_DEV_SERVER_HOST=webpacker
    command: ["rails", "server", "-b", "0.0.0.0"]
    ports:
      - 3000:3000
    volumes:
      - .:/web
      - gem_bundle:/usr/local/bundle
  db:
    image: mysql:5.7.25
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD="yes"
    ports:
      - 3306:3306
    volumes:
       - db_data:/var/lib/mysql

  webpacker:
    depends_on:
      - web
    image: myapp_web
    environment:
      - WEBPACKER_DEV_SERVER_HOST=0.0.0.0
    command: ./bin/webpack-dev-server
    volumes:
      - .:/web
      - gem_bundle:/usr/local/bundle
    ports:
      - 3035:3035
Installare quindi la gemma (docker-compose run --rm web bundle o eseguire il bundle da dentro il container)

Installata la gemma procedere con l'installazione di webpacker da dentro il container
:/web$ rails webpacker:install
Ora eseguite docker-compose up e su localhost:3000 avrete la pagina default di rails!