L'objectif est de fournir un environnement contenant les composants nécessaires au développement collaboratif d'une API Rails 5.
Prérequis
Installer Docker et Docker-compose.
Gemfile
Nous commençons par créer un Gemfile contenant les informations minimales.
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
Ce fichier va être utilisé par Docker pour constituer un conteneur qui va charger rails.
Docker
Nous créons ensuite le Dockerfile
contenant les lignes suivantes.
FROM ruby:2.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /api_server
WORKDIR /api_server
ADD Gemfile /api_server/Gemfile
RUN bundle install
ADD . /api_server
Rails 5 a besoin de ruby 2.2.2 au minimum, nous nous basons donc sur cette image pour créer notre environnement.
Docker-compose
Il nous reste le fichier docker-compose.yml
que nous allons configurer comme suit. Il va nous permettre de communiquer avec le conteneur qui fait tourner Rails.
version: '2'
services:
db:
image: postgres:9.6.0
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/api_server
ports:
- "3000:3000"
depends_on:
- db
Nous utilisons la version 2 de docker-compose afin de disposer de plus d'options (cf. compose-file).
image: postgres:9.6.0
Nous chargeons l'image 9.6.0 de postgre afin de toujours disposer du même SGBD sur tous les postes de travail.volumes: - .:/api_server
Nous créons un lien entre le répertoire courant et le répertoireapi_server
de notre conteneur que Dockerfile a copié lors du `ADD . /api_server.- ports:
ports: - "3000:3000"
Nous créons un lien entre notre port et le port de notre conteneur.
Création du projet Rails
Nous créons maintenant notre projet.
docker-compose run web rails new . --api --force --database=postgresql --skip-bundle
new .
Nous informons rails de créer le projet dans le répertoire courant.--api
Notre projet doit être une API-only--database=postgresql
La configuration doit être générée pour postgre.
Rails vient de nous créer notre projet !!
Sous Linux, il faut changer le détenteur de l’arborescence car Docker est lancé en mode root donc tous les répertoires sont à lui.
sudo chown -R $USER:$USER .
Finaliser l'installation du projet
CORS
Dé-commenter dans le Gemfile la ligne # gem 'rack-cors'
afin de permettre les requêtes AJAX inter-origine.
Il nous reste à configurer ce que nous autorisons dans le fichier config/initializers/cors.rb
.
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
Notre API doit être accessible depuis n'importe où et sur tout type de requête. Pour plus de détail sur ce qui est réalisable, rack-cors explique tout.
Notre Gemfile aillant changé, il ne nous reste qu'à construire notre projet en le demandant à docker-compose.
docker-compose build
Faire tourner notre serveur
Rails s'attend à avoir une base de donnée tournant en localhost hors elle est dans le conteneur. Il nous reste à spécifier dans config/database.yml
le host.
L'image de postgres initialise un utilisateur dans son docker-entrypoint.sh nommé postgres, c'est donc celui que nous allons utiliser dans notre configuration par défaut qui du coup doit ressembler à ceci.
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
host: db
username: postgres
password:
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
Une fois fait, nous allons lancer notre serveur pour la première fois à l'aide de la commande docker-compose up
.
Nous devons maintenant construire notre base de donnée à l'aide de la commande docker-compose run web rake db:create
. Vous l'aurez compris, toute commande rake peut se faire via docker-compose.
Finalement, nous testons que notre navigateur répond bien à l'adresse 127.0.0.1:3000 qui nous affiche une jolie image et les informations suivantes.
Rails version: 5.0.0.1
Ruby version: 2.2.2 (x86_64-linux)