đȘđł Construire un Dockerfile Rails de production : mon approche DevOps
Temps de lecture : 5 minutes
đš Cette Ă©dition est relativement longue car bcp dâimage, votre boĂźte mail risque de la tronquer. Je vous conseille de cliquer sur le titre ci-dessus pour lâouvrir dans votre navigateur web. âïž
Hello les petits Biscuits !
Bienvenue sur la 33Úme édition de Ruby Biscuit.
Vous ĂȘtes maintenant 583 abonnĂ©s đ„ł
Maintenant Ruby biscuit, câest aussi votre meilleur alliĂ© pour recruter des devs Ruby !
Si vous nâavez pas encore rejoint le club, RDV sur https://recrutement.rubybiscuit.fr
Bonne lecture.
đ Construire un Dockerfile Rails de production : mon approche DevOps
Je lâavoue, je suis un peu maniaque des coĂ»ts et des temps de build : je dĂ©teste quâune image devienne obĂšse, ou quâun build sâĂ©ternise⊠surtout quand je pourrais dĂ©jĂ boire un cafĂ© âïž ! Pour tous mes projets Rails, jâai mis au point un Dockerfile unique, rapide et lĂ©ger.
Dans cet article, je vous partage mes astuces (et mes petites manies đ)âŻ: comment jâen suis arrivĂ© lĂ , et surtout pourquoi jâai fait chaque choix.
đ Pourquoi jâaime chouchouter mon Dockerfile Rails
Le Dockerfile, câest souvent le parent pauvre du projet, mais câest le cĆur de votre environnement dâexĂ©cution. Le nĂ©gliger, câest un peu comme oublier dâajouter du sel dans une recetteâŻ: ça peut vite tourner au dĂ©sastreâŻ! Une mauvaise config peut entraĂźnerâŻ:
đŠ Des images trop lourdes (bonjour les tĂ©lĂ©chargements interminables)
đ Des builds qui traĂźnent (adieu la productivitĂ©)
đ Des secrets exposĂ©s (le cauchemar)
đš Des failles de sĂ©curitĂ© (panique Ă bord)
Jâai donc dĂ©cidĂ© de rendre ce fichier maintenable, sĂ©curisĂ© et rĂ©utilisable sur tous mes projets.
đ§ Un Dockerfile tout-terrain pour tous les projets
Pour Ă©viter de dupliquer un Dockerfile par projet, jâai introduit plusieurs ARG :
Cette paramétrisation permet de :
Choisir dynamiquement la version de Ruby et de Debian ;
Installer, si nécessaire, des paquets spécifiques à un projet ;
Adapter lâenvironnement Rails et Node sans modifier le Dockerfile.
Par exemple, je peux lancer :
et obtenir une image taillée sur mesure.
đïž Image de base et dĂ©pendances communes
Dans lâĂ©tape base, jâinstalle les dĂ©pendances systĂšme partagĂ©es par tous les projets :
Pourquoi ces paquets ?
libjemalloc2améliore la gestion mémoire de Ruby ;
libpq5est nécessaire au client PostgreSQL ;
shared-mime-info,fileetlesssont utiles pour les scripts et diagnostics.
Grùce aux --mount=type=cache, les index APT sont mis en cache, accélérant les builds suivants.
Configuration Ruby et mise Ă jour de Rubygems
Avant tout build applicatif, je dĂ©finis des variables dâenvironnement et je mets Ă jour Rubygems pour bĂ©nĂ©ficier des derniĂšres amĂ©liorations :
Astuce : Prévoir toujours un
RAILS_ENVexplicite garantit des builds reproductibles.
đ ïž Ătape 1 : production-builder
LâĂ©tape production-builder regroupe lâinstallation des outils et la compilation :
1. Outils de compilation
Ces paquets sont essentiels Ă la compilation :
build-essential: compilateurs C/C++ pour les extensions Ruby ;libssl-dev,libyaml-dev,libz-dev⊠: dépendances fréquentes des gems natives ;git: pour les gems hébergées sur Git.
2. Node.js et Yarn
Cette étape prépare la compilation des assets front-end avec Webpacker ou Sprockets.
3. Gems avec Bundler
Pour profiter du cache Docker et éviter de réinstaller les gems inutilement :
Docker invalide cette couche seulement si Gemfile ou Gemfile.lock changent, ce qui rend les rebuilds beaucoup plus rapides.
4. Faux secrets et assets
Le .env factice permet de satisfaire Rails sans exposer de vrais secrets ; qui sont injectés au runtime.
đŻ Ătape 2 : production
LâĂ©tape finale construit lâimage de prod en mode minimal :
Node.js facultatif
Je peux choisir de conserver Node.js pour debug ou mâen passer pour allĂ©ger lâimage.
Copie des artefacts
Seuls les gems et les assets prĂ©compilĂ©s sont repris, tout le reste reste dans lâĂ©tape builder.
Sécurité et droits
ExĂ©cuter lâapp en non-root limite les risques en cas de faille.
Exposition et lancement
Cette derniÚre ligne reste simple et claire pour démarrer le serveur Rails.
âïž Un .dockerignore chirurgical
Chaque ligne compte pour alléger le contexte :
# dossiers systĂšmes et dev
.git/
.bundle/
node_modules/
# logs et tmp
log/
tmp/
# secrets et configs locales
.env*
config/master.key
# assets compilés
public/assets
public/packs
Ce .dockerignore empĂȘche de copier tout ce qui nâest pas nĂ©cessaire au build.
đŠ Un systĂšme de CI centralisĂ©
Jâai centralisĂ© Dockerfile, .dockerignore, database.yml.template et .env factice dans un repo CI. Ce dossier est copiĂ© dans chaque projet pour garantir une cohĂ©rence et faciliter les mises Ă jour.
Dockerfile complet
Pour aller plus loin
Docker
Documentation officielle :
https://docs.docker.com/
Guide multi-stage : https://docs.docker.com/build/building/multi-stage/
Sécurité
Bonnes pratiques : https://docs.docker.com/develop/security-best-practices/
Performance
BuildKit : https://docs.docker.com/build/buildkit/
Ce Dockerfile mâa permis de gagner en rapiditĂ©, en lĂ©gĂšretĂ© et en sĂ©curitĂ©. JâespĂšre quâil vous servira autant quâil mâaccompagne au quotidien !
â Quentin















