-
Notifications
You must be signed in to change notification settings - Fork 69
refacto(docker): Improve DX + new Dockerfile with target #1764
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
f960142
to
c5c53dc
Compare
aa43be8
to
5560cd1
Compare
.docker/php/docker-entrypoint.sh
Outdated
|
||
if [ "$APP_ENV" != 'prod' ]; then | ||
if [ -d .git ]; then | ||
git config --global --add safe.directory /var/www/html |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pourquoi y a t-il besoin de faire cela ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
N'étant pas propriétaire du dossier dans le container du coup il y a un conflit de secu entre mon .git le dossier du projet. Pour éviter ce warning qui n'existe qu'en dev je lance cette commande.
.editorconfig
Outdated
@@ -0,0 +1,10 @@ | |||
[*] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
est-ce que cela ne serait-il pas à mettre dans place dans une autre PR ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oui pas de soucis.
- name: Tests - Functional | ||
run: make test-functional | ||
run: | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pourquoi avoir décomposé le lancement des tests ? Pour moi dans le fichier de configuration des actions/de la CI, on devrait avoir le moins de logique de lancement possible. Je pense qu'o devrait conserver le make test-functional.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
De mon point de vue, justement la CI doit être claire sur ce quelle fait sans devoir aller voir dans un autre fichier. D'autant plus que si on modifie une commande make pour des besoins en dev ça impact la CI sans le vouloir ou sans s'en rendre compte ce qui complexifie la lecture du projet. En plus ça complexifie aussi la compréhension du make file car il n'y a aucun moyen de savoir quelle commande est à exécuter et où ce qui peut être un frein pour de nouveau contributeur peut importe l'expérience de ce dernier.
- name: Tests - Integration | ||
run: make test-integration-ci | ||
run: | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
même remarque, on a un outil pour le lancer autant rester sur cette configuration dans le Makefile
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
De mon point de vue, justement la CI doit être claire sur ce quelle fait sans devoir aller voir dans un autre fichier. D'autant plus que si on modifie une commande make pour des besoins en dev ça impact la CI sans le vouloir ou sans s'en rendre compte ce qui complexifie la lecture du projet. En plus ça complexifie aussi la compréhension du make file car il n'y a aucun moyen de savoir quelle commande est à exécuter et où ce qui peut être un frein pour de nouveau contributeur peut importe l'expérience de ce dernier.
Dockerfile
Outdated
COPY --link ./composer.* ./ | ||
|
||
RUN set -eux; \ | ||
composer install --no-cache --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pourquoi mettre le composer install dans le Dockerfile ? ici on est sur une image pour du dev pas de la prod (on utilisera pas docker pour la prod), ça n'est pas son rôle.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour la target de prod ça à du sens de composer install pour start des images avec déjà les dépendances d'installer. Mais si il n'y a pas de docker en prod en effet cette target ne sert à rien. Je l'enlève.
Dockerfile
Outdated
|
||
RUN set -eux; \ | ||
npm install --legacy-peer-deps; \ | ||
npm run build; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
même remarque pour les assets ? sur une image pour de la prod ça peux avoir du sens, ici ce n'est pas le but de l'image. On doit pouvoir rebuilder les assets sans devoir rebuilder l'image de dev, autant le faire en dehors du build de l'image docker.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
J'enlève la target de prod vu qu'elle ne sert à rien.
Makefile
Outdated
##@ Setup 📜 | ||
### Installer le projet from scratch | ||
install: | ||
cp -n .env.dist .env && cp -n docker.env docker.env.local && cp -n .docker/data/history.dist .docker/data/history && cp -n compose.override.yml-dist compose.override.yml |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ici je pense qu'il vaux mieux continuer à tirer les bénéfices de Make. D'avoir des targets en fonction du fichier, qui sont en dépendance d'autres tagets.
Par exemple on avait :
compose.override.yml:
cp compose.override.yml-dist compose.override.yml
cela permet de ne faire la copie que si le fichier n'existe pas. Autant rester sur du standard de Make / qu'on peux facilement mettre en dépendance de différentes targets.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je sais que c'est le but premier du Makefile, mais cette stratégie complique la lecture et la compréhension du Makefile, faire des aller-retours de haut en bas du Makefile pour bien comprendre ce que fait un commande ce qui n'aide pas à la compréhension du projet dès l'install. Et du coup créer une target make juste pour cette fonctionnalité alors que le cp
n'est utilisé qu'à un seul endroit et qu'il y a une option dans cp
pour faire la même chose, ça augmente la complexité de compréhension pour pas grand chose.
|
||
## Targets cachés | ||
|
||
var/logs/.docker-build: compose.yml compose.override.yml $(shell find docker -type f) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
on pers la partie cache sur le docker up up faisant cela (même sil y a le cache docker), ça me semble dommage de perdre cela.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Désolé je ne comprends pas ce qu'apporte cette commande que n'apporte pas docker et buildx directement ? Surtout que var/logs/.docker-build
est vide du coup je comprends encore moins 🤔
node_modules: | ||
npm install --legacy-peer-deps | ||
|
||
init-db: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pourquoi avoir supprimé ces différentes méthodes permettant de décomposer l'installation ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je ne comprends pas trop l'interet de décomposer autant, quand une commande n'est utilisé qu'à un seul moment à l'installation du projet. Pour les commandes qui peuvent être utilisé pendant le processus de dev c'est normale mais pour les commandes d'installation je ne trouve pas ça pertinent et ça complexifie la compréhension pour rien, de mon point de vue externe.
build: | ||
context: . | ||
target: afup_web_dev | ||
container_name: afup-web-apachephp |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
par curiosité à quoi sert le container name ? (on a déjà un nom similaire qui est généré)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour justement ne pas laisser docker le généré comme il veut (souvent avec des chiffres dedans) c'est juste pour être constant sur le nommage des containers. Utile quand on a plusieurs projets d'allumer sur le même réseau pour différencier 2 services php ou nginx par exemple.
image: dockage/mailcatcher:0.9.0 | ||
container_name: afup-web-mailcatcher | ||
|
||
node: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comment va se passer le build des assets en ayant ce container dédié ? ce n'est pas plus simple d'avoir un container de cli toutes les dépendances nécéssaires ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
En dev, le container va s'allumer au moment de faire la commande de build puis s'éteindra à la fin (sauf pour le watch
) et vu que le mapping de volume est le même que les autres services les fichiers vont se synchroniser avec les autres container de manière transparente.
@@ -36,8 +36,7 @@ Ce document contient des instructions sur la mise en place d'une instance de dé | |||
git clone https://github.com/my-account/afup-web.git | |||
``` | |||
|
|||
3. Lancer `make docker-up` pour lancer le projet | |||
4. Lancer `make init` pour le setup initial (config, dépendances, base de données) | |||
3. Lancer `make install` pour lancer le projet |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ça me semble pertinent de conserver deux étapes, le up et init pour le lancement. Pourquoi avoir tout rassemblé ? (ça permettrais de généralement faire le up, la première fois de faire l'init ou le faire si on veux remettre à zéro son env de dev).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je trouve plus facile d'inclure de nouvelle personne dans un projet ne leur disant que tu n'as qu'une commande pour installer (si tu es curieux tu vas voir ce qu'elle fait) et de juste utiliser les commande docker de base que tu pourrais faire peut importe le projet dockerisé. Quand à remettre le projet de zéro c'est pour ça que je créait une commande reset pour vraiment enlevé les fichiers générés par le projet pour simuler un projet vierge comme si on venait de clone le projet.
var/cache/.gitkeep
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pourquoi avoir supprimé ces fichiers (surtout pour le cache et log) ? si on le fait autant le faire dans une autre PR en ayant validé aussi l'impact en prod et dev.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il se sont supprimé avec mes premiers tests de docker, je les remets.
.docker/config/bash_aliases
Outdated
# Global | ||
alias ll='ls -alh --color' | ||
alias clean-test-deprecated-log='rm -f /var/www/html/var/logs/test.deprecations.log' | ||
alias group-deprecation-log="touch /var/www/html/var/logs/test.deprecations_grouped.log && cat /var/www/html/var/logs/test.deprecations.log | cut -d \"]\" -f 2 | awk '{\$1=\$1};1' | sort | uniq -c | sort -nr > /var/www/html/var/logs/test.deprecations_grouped.log" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
avant on avait des targets Make, ici on a la logique qui est reproduite dans l'alias et dans test-functional Pourquoi ne pas conserver les targets permettant de factoriser cela ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ça permet de bien séparé les commandes qui se lance depuis le container (donc qui sont dans bash_aliases) et ceux qui se lance depuis l'extérieur de container (Makefile)
@@ -1,56 +0,0 @@ | |||
FROM php:8.2-apache |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pourquoi remonter ce container à la racine ? (du coup on a un container à la racine et ceux de MySQL / des ressources statiques dans docker/dockerfiles. On ne pourrait pas le laisser dans le dossier dockerfiles ? ça me semblerais plus cohérent de tous les y retrouver.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vu qu'il y avait l'utilisation d'un container node ce n'était plus pertinant de le mettre dans le dossier apachephp mais je remet dans le dossier docker.
51b4008
to
4630b65
Compare
02ac88e
to
8f1d084
Compare
a9579b8
to
a02c44f
Compare
J'ai regardé vite fait, et ça m'a l'air d'être un super première étape pour rendre les dockers / makefile plus au gout du jour et plus simple que ce que c'est actuellement :) Je dis "première étape", parce que j'ai l'impression qu'on pourra encore améliorer la DX et simplifier tout ça ! Bravo @mihani ! |
…dd node container + Add new npm command to simplify Makefile
…d doc to config xdebug and use breakpoint
…akefile (test part) + Add bash alias in container
ea16663
to
f93d409
Compare
f93d409
to
41913bb
Compare
Dans cette PR, il y la réécriture du Dockerfile pour avoir plusieurs target en fonction de l'environnement. Grâce à ce changement, il y a un ajout de docker-entrypoint pour pouvoir lancer un container avec le user localUser et donc simplifier les commandes du Makefile.
Ajout d'un docker.env(.local) qui permet de gérer les variables d'environnment pour le container de dev pour XDEBUG.
Ajout de plusieurs commandes make pour installer et reset le projet.
Ajout de commande dans package.json pour simplifier les commande node pour ce qui tourne autour des assets.
Concernant la target de prod :
Je propose cette refacto, donc si quelque chose ne vous convient pas ou si vous avez des remarques n'hésitez pas j'ai peut être loupé des informations.