4 min de lecture
Tutoriel : utiliser Docker et Docker Compose pour le développement Ruby on Rails
Utiliser Docker et Docker Compose pour le développement local présente de nombreux avantages. Dans ce tutoriel, nous verrons comment configurer ces outils pour le développement Ruby on Rails.

Dans ce tutoriel, nous allons voir comment configurer Docker et Docker Compose pour le développement local Ruby on Rails.
TL;DR : si vous ne voulez pas lire toute l’histoire, nous avons créé plusieurs gists pour vous. Il vous suffit de suivre les instructions dans leur README :
configuration Docker et Docker Compose pour le développement Ruby on Rails, sans base de données
configuration Docker et Docker Compose pour le développement Ruby on Rails avec PostgreSQL
Ce tutoriel ne couvre pas l’installation de Docker sur votre ordinateur. Vous pouvez vous référer à la documentation officielle de Docker.
Objectif
Nous voulons disposer d’un environnement de développement Ruby on Rails standard et homogène, isolé de tous nos autres projets de développement.
Cet environnement de développement doit également inclure webpack-dev-server comme environnement de test.
Il doit être possible de l’étendre avec une base de données.
Nous voulons exécuter notre code source Ruby on Rails local dans un conteneur Docker, quelle que soit la version de Ruby ou de Rails.
Nous voulons une configuration Docker Compose permettant d’exécuter le conteneur de notre app, webpack-dev-server, notre suite de tests et des bases de données.
Bénéfices
L’utilisation de Docker et Docker Compose pour configurer un environnement de développement local présente de nombreux avantages.
Pour chacun de nos projets, nous pouvons spécifier très facilement :
une version exacte de Ruby
une version exacte de Rails
une version exacte du moteur de base de données
De plus, chacun de nos projets sera complètement isolé :
changer une version mineure ou majeure du langage, du framework, des libs ou du moteur de base de données ne viendra pas perturber nos autres projets de développement
nous pouvons avoir, dans un conteneur, des dépendances logicielles spécifiques liées à un projet donné, sans conséquence sur nos autres projets
Et comme nous pouvons spécifier clairement chaque version de notre stack, nous serons plus proches de la parité dev/prod.
Enfin, nous pouvons complètement simplifier la configuration de l’environnement de développement local : il est plus facile d’onboarder de nouveaux développeurs sur nos projets, ou simplement de revenir sur un projet que nous n’avons pas touché depuis des mois ou des années.
Étape 0 : créer la structure des fichiers {#step-0}
Tout d’abord, nous créons le répertoire qui hébergera notre code source et nous créons trois fichiers vides : Dockerfile, docker-compose.yml et entrypoint.sh.
Le Dockerfile sert à indiquer à Docker comment construire un conteneur à partir de notre code source, et le fichier docker-compose.yml sert à indiquer comment exécuter plusieurs conteneurs, y compris celui de notre app. Nous reviendrons plus tard sur le fichier entrypoint.sh.
Étape 1 : copier le Dockerfile {#step-1}
Il existe de nombreuses façons de construire une image de conteneur Docker. La plus simple et la plus flexible consiste à écrire un Dockerfile.
Un Dockerfile est un fichier texte très simple qui décrit les différentes étapes à suivre pour construire une image Docker.
Chaque ligne du Dockerfile est une étape de la recette, commençant par un mot-clé spécial appelé commande.
Dans notre Dockerfile, nous n’utiliserons que 6 commandes :
FROM: spécifier une image Docker externe que nous utiliserons comme couche de baseRUN: exécuter une commande dans le cadre de notre conteneurENV: construire une variable d’environnementWORKDIR: spécifier le répertoire de base dont dépendent toutes les autres commandesCOPY: copier un fichier depuis notre système de fichiers local vers le conteneurENTRYPOINT: indiquer comment démarrer notre conteneur Docker
Voici le Dockerfile que nous utiliserons pour tous nos projets Ruby on Rails. N’ayez pas peur, nous ferons une analyse ligne par ligne ci-dessous !
Analyse de notre Dockerfile
Nous allons utiliser l’image Docker officielle Ruby. Comme nous voulons utiliser Ruby 3.0.1, nous baserons notre image Docker sur la version Docker 3.0.1. La version du tag de l’image Docker est la même que la version du langage Ruby.
Comme notre objectif est d’installer des gems, nous allons indiquer à notre conteneur Docker où stocker le code source de nos gems. GEM_HOME indiquera à Bundler où stocker les gems. Ici, nous voulons que le code source des gems soit installé dans le répertoire bundle. Nous verrons plus bas où ce répertoire bundle sera réellement stocké sur notre système de fichiers local.
Et bien sûr, nous voulons que les binstubs des gems soient disponibles dans le PATH standard à l’intérieur de notre conteneur :
Les images Docker officielles Ruby sont basées sur Ubuntu. Nous pouvons utiliser les outils standards d’Ubuntu. Nous aimerions d’abord mettre à jour la base d’informations des paquets. L’option -qq sert à n’afficher que les messages d’erreur.
Comme Rails nécessite que Node soit installé, nous pouvons l’installer avec son paquet Ubuntu.
Les versions récentes de Rails installent la gem webpacker, qui nécessite l’installation de Yarn. Voici une méthode pour installer Yarn depuis le dépôt Debian/Ubuntu officiel fourni par Yarn.
Nous voulons préciser que notre répertoire de travail de base sera /usr/src/app.
Enfin, nous ajoutons un script qui sera exécuté à chaque démarrage du conteneur.
Étape 2 : copier docker-compose.yml {#step-2}
docker-compose est un outil permettant d’exécuter plusieurs conteneurs Docker en parallèle.
Un simple fichier texte au format YAML appelé docker-compose.yml est nécessaire pour indiquer à Docker Compose comment exécuter plusieurs conteneurs Docker appelés services.
Voici le fichier docker-compose.yml que nous utiliserons. Nous commencerons avec une configuration très simple.
Analyse de notre docker-compose.yml
TBD
Étape 3 : copier entrypoint.sh {#step-3}
TBD
Étape 4 : initialiser notre nouvelle app Rails {#step-4}
Maintenant que nous avons configuré Docker, avec la version exacte de Ruby dont nous avons besoin pour ce projet, il est temps de les exécuter !
Nous voulons d’abord lancer une commande bash dans le conteneur de notre app pour installer Ruby on Rails.
Nous exécutons maintenant un terminal bash dans le conteneur de notre app en cours d’exécution.
Nous pouvons maintenant procéder à l’installation de Rails.
La gem et toutes ses dépendances seront installées dans notre répertoire bundle local.
Une fois cela terminé, nous pouvons créer la structure de notre app :
Chaque fois que vous devrez sortir d’un conteneur Docker en cours d’exécution, vous pouvez taper exit puis appuyer sur ENTRÉE, ou utiliser CTRL+D.
Lancer la commande docker-compose run web command est notre solution de référence pour exécuter n’importe quelle commande dans notre conteneur en cours d’exécution. Vous pouvez l’utiliser pour lancer un terminal bash comme décrit ci-dessus, exécuter une commande Bundler comme docker-compose run web bundle install devise, ou une commande Yarn comme docker-compose run web yarn install @hotwired/turbo-rails.
Étape 5 : démarrer notre stack locale {#step-5}
Vous pouvez lancer docker-compose up et visiter http//localhost:3000 dans votre navigateur.
Lancer la commande docker-compose up est notre solution de référence pour démarrer n’importe quel projet Rails utilisant la configuration Docker et Docker Compose décrite dans ce tutoriel.
Voilà, nous avons maintenant un environnement de développement Rails local fonctionnel avec Docker !
Étape 6 : configurer webpack-dev-server {#step-6}
Les versions récentes de Rails nécessitent Webpack. La compilation live des assets est effectuée par un daemon appelé webpack-dev-server.
Nous allons l’ajouter comme nouveau service dans notre fichier docker-compose.yml, qui ressemble désormais à ceci :
De plus, comme webpack-dev-server sera exécuté dans un conteneur séparé de notre conteneur d’app habituel, nous devrons binder webpack-dev-server sur 0.0.0.0, c’est-à-dire sur toutes les interfaces réseau. De cette façon, il sera accessible depuis l’extérieur de son conteneur.
Dans config/webpacker.yml, remplacez la clé development/dev_server/host par la valeur 0.0.0.0 (localhost est la valeur par défaut, et nous ne voulons pas l’utiliser).
Maintenant, arrêtez la stack, reconstruisez-la et redémarrez-la.
Nous avons maintenant une flotte de 2 conteneurs en cours d’exécution : un conteneur exécutant notre code source Rails et un conteneur exécutant webpack-dev-server.
Étape 7 : ajouter une base de données PostgreSQL à notre stack locale {#step-7-alt1}
La première chose sera d’ajouter une nouvelle entrée dans la section services de notre fichier docker-compose.yml, qui ressemblera maintenant à ceci :
Étape 7 alternative : ajouter une base de données MySQL à notre stack locale {#step-7-alt2}
Étape 7 alternative : ajouter une base de données Redis à notre stack locale {#step-7-alt3}

Yann Klis
Yann KLIS a fondé Scalingo en 2015 avec son associé Léo Unbekandt avec la vision de proposer une plateforme cloud d'hébergement web, véritable alternative européenne et souveraine aux géants américains. Aujourd'hui Scalingo héberge plusieurs milliers d'applications web déployées par des clients du monde entier ! L'objectif de Scalingo est de devenir la plateforme cloud de référence pour les développeurs web en Europe. Auparavant, il a fondé Novelys, un studio de développement spécialisé dans la technologie Ruby on Rails.
Restez informé
Recevez des articles et des mises à jour de la plateforme dans votre boîte de réception.
Prêt à déployer en toute confiance ?
Découvrez des déploiements sans temps d'arrêt, une mise à l'échelle automatique intelligente et une infrastructure entièrement gérée. Commencez à déployer vos applications sur Scalingo dès aujourd'hui.
Aucune carte de crédit requise • Déployez en quelques minutes • Annulez à tout moment






