Skip to content

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

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

mihani
Copy link
Contributor

@mihani mihani commented May 4, 2025

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 :

  • Build - ok
  • Running - ok
    image

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.

@mihani mihani force-pushed the refacto/docker-to-improve-dx branch 3 times, most recently from f960142 to c5c53dc Compare May 4, 2025 18:12
@mihani mihani marked this pull request as draft May 4, 2025 18:20
@mihani mihani force-pushed the refacto/docker-to-improve-dx branch 9 times, most recently from aa43be8 to 5560cd1 Compare May 7, 2025 19:00
@mihani mihani marked this pull request as ready for review May 7, 2025 19:10

if [ "$APP_ENV" != 'prod' ]; then
if [ -d .git ]; then
git config --global --add safe.directory /var/www/html
Copy link
Member

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 ?

Copy link
Contributor Author

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 @@
[*]
Copy link
Member

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 ?

Copy link
Contributor Author

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: |
Copy link
Member

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.

Copy link
Contributor Author

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: |
Copy link
Member

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

Copy link
Contributor Author

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
Copy link
Member

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.

Copy link
Contributor Author

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;
Copy link
Member

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.

Copy link
Contributor Author

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
Copy link
Member

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.

Copy link
Contributor Author

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)
Copy link
Member

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.

Copy link
Contributor Author

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:
Copy link
Member

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 ?

Copy link
Contributor Author

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
Copy link
Member

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é)

Copy link
Contributor Author

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:
Copy link
Member

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 ?

Copy link
Contributor Author

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
Copy link
Member

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).

Copy link
Contributor Author

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.

Copy link
Member

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.

Copy link
Contributor Author

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.

# 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"
Copy link
Member

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 ?

Copy link
Contributor Author

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
Copy link
Member

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.

Copy link
Contributor Author

@mihani mihani May 9, 2025

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.

@mihani mihani force-pushed the refacto/docker-to-improve-dx branch from 51b4008 to 4630b65 Compare May 24, 2025 08:10
@mihani mihani force-pushed the refacto/docker-to-improve-dx branch 2 times, most recently from 02ac88e to 8f1d084 Compare May 24, 2025 10:43
@mihani mihani requested a review from agallou May 24, 2025 11:04
@mihani mihani force-pushed the refacto/docker-to-improve-dx branch 5 times, most recently from a9579b8 to a02c44f Compare May 24, 2025 12:41
@ternel
Copy link
Contributor

ternel commented May 30, 2025

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 !

@mihani mihani force-pushed the refacto/docker-to-improve-dx branch 6 times, most recently from ea16663 to f93d409 Compare June 9, 2025 17:41
@mihani mihani force-pushed the refacto/docker-to-improve-dx branch from f93d409 to 41913bb Compare June 9, 2025 19:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants