|
|
9 月之前 | |
|---|---|---|
| .ssh | 5 年之前 | |
| apps | 6 年之前 | |
| docker | 9 月之前 | |
| useruploaddata | 5 年之前 | |
| .DS_Store | 6 年之前 | |
| .dockerignore | 5 年之前 | |
| .env.skeleton | 9 月之前 | |
| .gitignore | 2 年之前 | |
| Makefile.skeleton | 2 年之前 | |
| README.md | 9 月之前 | |
| docker-compose-osx.yml | 1 年之前 | |
| docker-compose.yml | 9 月之前 | |
| icon.svg | 1 年之前 | |
| logo.png | 4 年之前 |
Le projet docker offre un environnement de développement complet.
Installer Docker Engine : https://docs.docker.com/install/linux/docker-ce/ubuntu/
Et Docker Compose : https://docs.docker.com/compose/install/
Faire :
docker ps
Si Docker ne marche pas sans "sudo" appliquer : https://techoverflow.net/2017/03/01/solving-docker-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket/
sudo usermod -aG docker $USER
Attention, le VPN peut parfois induire une erreur lors de l'installation de docker avec apt-get, mieux vaut le désactiver le temps de l'installation.
git clone git@gitlab.2iopenservice.com:vincent/docker.git
Les repositories suivants doivent être clônés dans les sous-répertoires suivants:
| Folder | Repo | SSH |
|---|---|---|
| apps/opentalent | Voir le repository | git@gitlab.2iopenservice.com:developper/opentalent.git |
| apps/opentalent-admin-2.0 | Voir le repository | git@gitlab.2iopenservice.com:vincent/opentalent-admin-2.0.git |
| apps/opentalent-config | Voir le repository | git@gitlab.2iopenservice.com:developper/opentalent-config.git |
| apps/opentalent-platform | Voir le repository | git@gitlab.2iopenservice.com:opentalent/opentalent-platform.git |
| apps/ot_typo3 | Voir le repository | git@gitlab.2iopenservice.com:opentalent/ot_typo3.git |
| apps/metabase | Voir le repository | git@gitlab.2iopenservice.com:vincent/metabase.git |
| apps/python-scripts/clonedb | Voir le repository | git@gitlab.2iopenservice.com:opentalent/clonedb.git |
| apps/agenda | Voir le repository | git@gitlab.2iopenservice.com:opentalent/agenda.git |
| apps/ap2i | Voir le repository | git@gitlab.2iopenservice.com:opentalent/ap2i.git |
| apps/ap2i-doc | Voir le repository | git@gitlab.2iopenservice.com:vincent/ap2i-doc.git |
| apps/app | Voir le repository | git@gitlab.2iopenservice.com:opentalent/app.git |
| apps/app_v3 | Voir le repository | git@gitlab.2iopenservice.com:opentalent/app_nuxt3.git |
| apps/app-doc | Voir le repository | git@gitlab.2iopenservice.com:vincent/app-doc.git |
| apps/site_logiciels | Voir le repository | git@gitlab.2iopenservice.com:opentalent/site_logiciels.git |
.envCopier le fichier .env.skeleton en .env (attention à ne pas supprimer le fichier .env.skeleton!)
Mettre à jour le contenu de .env selon votre config:
OS: LINUX ou MAC selon votre système d'exploitationLes autres variables peuvent être laissées telles quelles.
Nb: le hash de contrôle
COMPOSER_HASHchange à chaque nouvelle version de composer. Si la version de composer installée sur les containers change, cette variable doit être mise à jour avec la clé indiquée ici: https://getcomposer.org/download/
/etc/hostsLes domaines locaux doivent être enregistrés sur la machine hôte (=votre machine).
Pour cela, ajouter les lignes suivantes à votre fichier /etc/hosts:
127.0.0.1 local.api.opentalent.fr # Docker 'php70'
127.0.0.1 local.mailcatcher.opentalent.fr # Docker 'mailcatcher'
127.0.0.1 local.v59.opentalent.fr # Docker 'adminassos'
127.0.0.1 local.phpmyadmin.opentalent.fr # Docker 'phpmyadmin'
127.0.0.1 local.elasticsearch.opentalent.fr # Docker 'es'
127.0.0.1 local.admin.opentalent.fr # Docker 'admin'
127.0.0.1 local.thumbor.opentalent.fr # Docker 'thumbor'
127.0.0.1 local.sub.opentalent.fr # Docker 'typo3'
127.0.0.1 local.agenda.opentalent.fr # Docker 'agenda'
127.0.0.1 local.blackfire.opentalent.fr # Docker 'blackfire'
127.0.0.1 local.metabase.opentalent.fr # Docker 'metabase'
127.0.0.1 local.ap2i.opentalent.fr # Docker 'ap2i-doc'
127.0.0.1 local.ap2i-doc.opentalent.fr # Docker 'ap2i-doc'
127.0.0.1 local.app.opentalent.fr # Docker 'app'
127.0.0.1 local.app-doc.opentalent.fr # Docker 'app-doc'
127.0.0.1 local.mercure.opentalent.fr # Docker 'mercure'
127.0.0.1 local.logiciels.opentalent.fr # Docker 'logiciels'
127.0.0.1 local.maestro.opentalent.fr # Docker 'maestro'
127.0.0.1 local.nuxt_common.opentalent.fr # Docker 'nuxt_common'
Attention: les domaines indiqués ici doivent correspondre aux domaines définis dans le fichier
.env
Pour permettre l'usage de l'HTTPS, il faut générer des certificats pour les domaines locaux.
Lancer les commandes suivantes :
chmod +x docker/nginx-proxy/certs/ssl_keys.sh
sh docker/nginx-proxy/certs/ssl_keys.sh
Vérifier ensuite la prise en compte des certificats:
docker-compose build
docker-compose up
Si
docker upbloque à cause du port 80 : vérifier qu'aucun programme sur votre machine n'écoute le port 80 (Apache est souvent coupable...): https://linuxize.com/post/check-listening-ports-linux/
Faire ensuite un docker stop $(docker ps -a -q)
Pour synchroniser les DB, on utilise clonedb. Cet utilitaire est
préinstallé sur le container python39
Pour l'exécuter:
docker exec -it python39 bash
cd clonedb
Puis, pour synchroniser toutes les bases (recommandé si c'est la première synchronisation) :
python3 clonedb.py
Ou, pour synchroniser seulement une ou plusieurs bases :
python3 clonedb.py [operation]
L'opération est le nom défini à la section 'operations' du fichier /env/clonedb/settings.yml Pour plus d'infos: https://gitlab.2iopenservice.com/opentalent/clonedb/blob/master/readme.md
Pour clôner l'index elasticsearch, plusieurs options.
Se connecter au docker php70:
docker exec -it php70 bash
Puis lancer:
npm install elasticdump@3.3.7 -g
elasticdump --input http://elasticsearch.2iopenservice.com:9200//search --output http://es:9200/search_bkp --type=analyzer
elasticdump --input http://elasticsearch.2iopenservice.com:9200//search --output http://es:9200/search_bkp --type=mapping
Pour synchroniser les données complètes (nécessite un bon débit descendant et de l'espace disque disponible pour 50 à 100 Go):
elasticdump --input http://elasticsearch.2iopenservice.com:9200// --input-index=search --output http://es:9200/ --output-index=search_dump --type=data
Pour synchroniser les données d'un type spécifique:
elasticdump --input http://elasticsearch.2iopenservice.com:9200// --input-index=search//course --output http://es:9200/ --output-index=search_dump//course --type=data
Regénérer un index complet. Nécessite de l'espace disque disponible pour 50 à 100 Go, peut nécessiter plusieurs jours de traitement.
Se connecter au docker php70:
docker exec -it php70 bash
Puis lancer:
app/console fos:elastica:populate --process-isolation --no-debug
Poue ne générer que certains types, lancer:
php app/console fos:elastica:populate --index search --process-isolation --no-debug --no-reset --type organization
php app/console fos:elastica:populate --index search --process-isolation --no-debug --no-reset --type access
Se connecter a php70
docker exec -it php70 bash
Installer les vendor:
php composer.phar install
A la première exécution, composer va demander certains paramètres. Vous pouvez tout laisser par défaut, sauf:
database_host: db
database_port: 3306
database_password: mysql660
database_host_cms: db
database_port_cms: 3306
database_password_cms: mysql660
locale: fr
elastic_search_host: es
thumbor_url: 'http://thumbor'
typo3_base_url: 'http://typo3/'
Si le fichier app/config/parameters.yaml vient d'être créé, il est possible que la commande suivante doive-t être exécutée:
chown 1000:1000 /var/www/html/app/config/parameters.yml
Puis mettre à jour le schéma de la DB:
app/console d:s:u --force
Enfin, afin de prévenir des erreurs de permission:
chmod -R 777 /var/www/html/app/cache/
À ce niveau, la page de documentation d'API Platform devrait être accessible à l'adresse https://local.api.opentalent.fr/doc
Se connecter au docker:
docker exec -it admin bash
Lancer npm install
npm install
Lancer Bower install
bower install
Lancer le serveur front:
gulp serve
Si l'erreur "SyntaxError: Unexpected toker {" apparait au moment du gulp serve. Il faut faire :
npm uninstall -g gulp-cli gulp
npm install -g gulp@3.9.1
Se connecter au docker:
docker exec -it ap2i bash
Puis lancer :
composer install
echo "APP_ENV=docker" > .env.local
apt install wkhtmltopdf
Se connecter au docker:
docker exec -it app bash
Puis lancer :
yarn install
ln -s .env.docker .env
Se connecter au docker:
docker exec -it agenda bash
Puis lancer :
yarn install
ln -s .env.docker .env
Se connecter au docker:
docker exec -it site_logiciels bash
Puis lancer :
yarn install
ln -s .env.docker .env
Se déplacer dans le sous-répertoire ot_typo3/docker:
cd apps/ot_typo3/docker
Puis exécuter :
sh clone-install.sh
Enfin, revenir à la racine du projet:
cd ../../..
Plus d'infos ici: https://gitlab.2iopenservice.com/opentalent/ot_typo3/-/blob/master/doc/docker.md
Exécuter :
pip3 install -r requirements.txt
Se connecter au docker:
docker exec -it maestro bash
Puis lancer :
symfony console d:d:c symfony console d:m:m symfony console d:f:l symfony console serve -d
Connexion : user: admin@mail.fr mdp: admin
Pour générer la PHP-DOC de l'API :
docker run --rm -v /opt/opentalent/apps/api/src/:/data -v /opt/opentalent/apps/apidoc:/output phpdoc/phpdoc:3.1 -d /data -t /output
La documentation devrait ensuite être accessible à: http://local.api-doc.opentalent.fr
Pour démarrer une instance docker complète, se placer dans le répertoire de votre projet docker, puis lancer:
docker-compose up
Patienter quelques secondes, puis dans un nouveau terminal, lancer:
gulp serve
Si vous ne l'avez pas encore fait, créer le symlink vers le fichier d'environnement :
ln -s .env.docker .env
Puis, lancer:
yarn dev
nginx-proxyGère le routage de toutes les requêtes envoyées au ports 80 et 443 de la machine hôte et les redirige vers le container cible.
mariaDbHéberge les bases de données MariaDb de tous les containers.
Les autres dockers peuvent ensuite accéder au serveur de base de données de cette manière:
| Db Host | db |
| Login | root |
| Pass | mysql660 |
nginxTODO : à quoi il sert ?
php70Héberge la partie back du logiciel : https://gitlab.2iopenservice.com/opentalent/opentalent-platform
Ce container embarque une installation de php-fpm v7.0.
nginx_newTODO : à quoi il sert ?
ap2iServeur sur lequel est présent la version Symfony 5.3 du Back. Penser à copier le dossier ap2i/jwt vers config
mercureServeur Caddy servant de hub Mercure
python39Héberge différents scripts python, dont clonedb.
Embarque une installation de python3.9.
adminHéberge l'application frontend Opentalent, version pré-2021: https://gitlab.2iopenservice.com/vincent/opentalent-admin-2.0/-/tree/master-front
appHéberge l'application frontend Opentalent v2: https://gitlab.2iopenservice.com/opentalent/app
typo3Héberge une instance Typo3 version 9.5, qui sert tous les mini-sites des clients.
adminassosTODO: à quoi il sert?
metabaseTODO: à quoi il sert?
esHéberge une instance elasticsearch TODO: à compléter
thumborHéberge une instance thumbor dont le rôle est de fournir des fichiers via une API.
phpmyadminHéberge une instance phpmyadmin
mailcatcherTODO: à quoi il sert?
blackfireHéberge une instance blackfire, utilisée pour l'analyse des performances des dockers php
phpdocHéberge une instance phpdoc, qui permet ensuite de générer des documentations automatiques à partir du code PHP.
jsdocTODO: à quoi il sert?
site_logicielsSite internet présentant les logiciels de l'entreprise
Prod: logiciels.opentalent.fr
La section networks du docker-compose permet de configurer un réseau interne auxquel pourront appartenir les
containers.
Voir: https://docs.docker.com/compose/networking/
https://docs.docker.com/compose/compose-file/compose-file-v3/#networks
Ici, on définit un seul réseau nommé network, au sein duquel les ips seront de la forme 172.20.[0-255].[1-254]
Pour qu'un container puisse appartenir au réseau, sa définition doit comporter une entrée de cette forme :
networks:
- network
On pourra aussi assigner une IP fixe à un container en précisant cette configuration, par exemple :
networks:
network:
ipv4_address: 172.20.2.2
Les ports de l'hôte peuvent être assignés aux ports d'un container en ajoutant une section ports à la définition du
container. Exemple :
ports:
- "3001:3000"
- "3002:3001"
Ces entrées sont de la forme : <port de l'hôte>:<port du container>
Dans l'exemple précédent, une requête reçue sur le port 3001 par la machine hôte sera dirigée vers le port 3000 du container.
La configuration du fichier hosts permet de rediriger certaines url locales (ex: local.api.opentalent.fr) vers la
machine locale (i.e. localhost).
Voir: https://gitlab.2iopenservice.com/opentalent/docker/-/blob/master/README.md#le-fichier-etchosts
Le container nginx-proxy est configuré pour recevoir les requêtes des ports 80 et 443 de la machine hôte, et reçoit donc
les requêtes adressées aux urls locales.
Ce container est configuré pour identifier tous les containers de
son réseau pour lesquels une variable d'env VIRTUAL_HOST a été définie, et redirigera les requêtes d'une url au
container dont le vhost correspond.
Les virtual hosts sont définis dans le fichier .env. Pour attribuer un nom d'hôte à un container, on ajoute ensuite
dans le docker-compose.yml une entrée de cette forme à sa configuration :
environment:
- VIRTUAL_HOST=${SOME_VIRTUAL_HOST}
Pour utiliser un autre port que le port 80, on peut ajouter une variable VIRTUAL_PORT :
environment:
- VIRTUAL_HOST=${SOME_VIRTUAL_HOST}
- VIRTUAL_PORT=${SOME_PORT}
Sur leur réseau interne, les noms d'hôtes des containers sont définis via l'entrée hostname de leur configuration.
Généralement, ces hostnames sont identiques à leurs noms de container.
Exemple : pour adresser une requête au docker
db, le containerapienverra sa requête à l'adressehttp://db
Il est cependant possible d'attribuer des aliases aux containers, ex :
networks:
network:
aliases:
- docker.sub.opentalent.fr
Ainsi configuré, le docker sera joignable sur le réseau interne à l'adresse http://docker.sub.opentalent.fr.
| Container | hostname | In Network ? | IP fixe | Ports | VIRTUAL_HOST / PORT | Aliases |
|---|---|---|---|---|---|---|
| nginx-proxy | nginx-proxy | O | - | 80:80, 443:443 | - | - |
| db | db | O | 172.20.1.3 | 3306:3306 | - | - |
| nginx | nginx | O | - | - | local.api.opentalent.fr | docker.nginx.opentalent.fr |
| php70 | php70 | O | 172.20.1.1 | - | - | - |
| nginx_new | nginx_new | O | - | - | local.ap2i.opentalent.fr | - |
| ap2i | ap2i | O | 172.20.2.1 | - | - | - |
| mercure | mercure | O | 172.20.4.0 | - | local.mercure.opentalent.fr | - |
| python39 | python39 | O | 172.20.4.1 | - | - | - |
| admin | admin | O | 172.20.1.2 | 3000:3000, 3001:3001 | local.admin.opentalent.fr / 3000 | - |
| app | app | O | 172.20.2.2 | 3002:3000, 3003:3003 | local.app.opentalent.fr / 3002 | - |
| app_v3 | app_v3 | O | 172.20.2.3 | 3009:3000, 24678:24678 | local.app-v3.opentalent.fr / 3000 | - |
| agenda | agenda | O | 172.20.2.5 | 3007:3000, 24679:24679 | local.agenda.opentalent.fr / 3000 | - |
| site_logiciels | site_logiciels | O | 172.20.2.6 | 3010:3000, 24680:24680 | local.logiciels.opentalent.fr / 3000 | - |
| typo3 | typo3 | O | 172.20.3.1 | - | local.sub.opentalent.fr | docker.sub.opentalent.fr, docker.sub.customdomain.fr |
| adminassos | adminassos | O | - | - | local.v59.opentalent.fr | - |
| metabase | metabase | O | - | - | local.metabase.opentalent.fr / 3000 | - |
| es | es | O | - | - | local.elasticsearch.opentalent.fr / 9200 | - |
| thumbor | thumbor | O | - | - | local.thumbor.opentalent.fr | - |
| phpmyadmin | phpmyadmin | O | - | - | local.phpmyadmin.opentalent.fr | - |
| memcached | memcached | X | - | - | - | - |
| mailcatcher | mailcatcher | O | - | 1025:1025 | local.mailcatcher.opentalent.fr / 1080 | - |
| blackfire | blackfire | O | - | - | local.blackfire.opentalent.fr / 8707 | - |
| phpdoc | phpdoc | O | - | - | local.ap2i-doc.opentalent.fr | - |
| jsdoc | jsdoc | O | - | - | local.app-doc.opentalent.fr | - |
Si les dockers sont up, tout arrêter :
docker-compose stop
Ajouter les lignes suivantes au fichier docker/nginx-proxy/certs/ssl_keys.sh
cp docker/nginx-proxy/certs/default.key docker/nginx-proxy/certs/<my-domain.fr>.key
cp docker/nginx-proxy/certs/default.crt docker/nginx-proxy/certs/<my-domain.fr>.crt
en remplaçant <my-domain.fr> par le nom de domaine attendu.
Exécuter le script depuis la racine du projet docker :
sh docker/nginx-proxy/certs/ssl_keys.sh
Supprimer le docker nginx-proxy, puis re-builder:
docker-compose rm nginx-proxy
docker-compose build --no-cache
Puis relancer docker.
Pour que le certificat soit validé sur chrome, allez à l'adresse cible, ouvrir la console de debugger et entrer :
console.log(window.atob('dGhpc2lzdW5zYWZl'));
Cliquer ensuite n'importe où sur la page, et taper le mot qui s'est affiché dans la console précédemment.
Lorsque vous demandez la page http://local.admin.opentalent.fr/#/login , la page reste blanche, et le message d'erreur suivant s'affichent dans la console :
Uncaught Error: Cannot find module "@opentalent/ruler/lib/model/rule.class"
Accéder au container adminLegacy:
docker exec -it admin bash
Puis exécuter:
cd modules/ruler && jison -t rule.jison && babel --presets=es2015 model/**/*.js model/*.js -d lib && npm link && cd ../.. && npm link @opentalent/ruler
Enfin, relancer:
gulp serve
Lorsque vous demandez la page https://local.api.opentalent.fr/doc, une erreur php s'affiche, avec un message similaire à ceci :
RuntimeException in ClassCollectionLoader.php line 280: Cache directory "/var/www/html/app/cache/dev" is not writable.
Accéder au docker php70 :
docker exec -it php70 bash
Puis exécuter :
chmod -R 777 /var/www/html/app/cache/
Lorsque l'un de vos containers essaie d'accéder à un serveur extérieur en SSH, l'accès est refusé.
Vérifier d'abord que le répertoire ~/.ssh de votre machine a bien été copié dans le docker à l'emplacement:
/root/.ssh
Si ce n'est pas le cas, ajouter la ligne suivante au Dockerfile concerné:
COPY /.ssh /root/.ssh
Et relancer un:
docker-compose build
Si le problème persiste, vérifier que les droits du répertoire .ssh sont identiques à ceci:
drwxr-xr-x 1 root root 4096 Feb 24 16:01 .
drwx------ 1 root root 4096 May 10 12:04 ..
-rw-r--r-- 1 root root 0 Mar 18 2020 .gitkeep
-rw------- 1 root root 887 Mar 18 2020 id_rsa
-rw------- 1 root root 1678 Mar 18 2020 id_rsa_exploitation
-rw-r--r-- 1 root root 397 May 15 2020 id_rsa_exploitation.pub
-rw-r--r-- 1 root root 888 May 12 14:19 known_hosts
Accéder au docker php70:
docker exec -it php70 bash
Lancer:
app/console d:s:u --force
Suite à une modification des annotations, il faut forcer un vidage du cache symfony:
Accéder au docker php70:
docker exec -it php70 bash
Lancer:
rm -r app/cache/*
chmod -R 777 app/cache/
Puis quitter le docker:
exit
et le redémarrer:
docker restart
Pour régénérer l'index elasticsearch:
Accéder au docker php70:
docker exec -it php70 bash
Lancer, puis interrompre dès qu'il commence à populate les organizations :
php app/console fos:elastica:populate --index search
Se rendre sur l'interface graphique elasticsearch, et se connecter à https://local.elasticsearch.opentalent.fr/
Attention à ce que le navigateur ne bloque pas le certificat SSL, essayez d'abord d'ouvrir https://local.elasticsearch.opentalent.fr/ dans un onglet à part
Supprimer l'alias search de l'index qui le porte, et ajouter ce même alias à l'index nouvellement créé
Faire, dans cet ordre précis:
Couper le VPN
Couper le service docker:
sudo systemctl stop docker
Redémarrer le VPN
Redémarrer docker
sudo systemctl start docker
Vérifier que le fichier .env existe dans le projet. Sinon :
ln -s .env.local .env
Il suffit de se loguer pour résoudre cette erreur: local.admin.opentalent.fr/#/login
Si on est déjà authentifié côté back, vérifier qu'on accède bien au front en https, sans quoi les cookies opentalent.fr ne seront pas accessibles.
Il faut récupérer l'ID du container :
Supprimer le container :
docker rm ID_CONTAINER --force
Récupérer l'ID de l'image qui servira à construire le container :
Supprimer l'image :
docker rmi ID_IMAGE --force
Vider le cache du Builder :
docker builder prune
On relance le compose
docker-compose up
# Build docker compose
docker-compose build
# Lancer le docker-compose == lancer les containers
docker-compose up
# Stopper le docker-compose == stopper les containers
docker-compose stop
# Stopper tous les containers quelque soit le docker-compose
docker stop $(docker ps -a -q)
# Supprimer tous les container Docker
docker rm $(docker ps -a -q)
# Supprimer toutes les images Docker
docker rmi $(docker images -q)
# Lister les proccess Docker
docker ps
# Lister les containers actifs
docker container ls
# Lister tous les containers
docker container ls -a
# Lister les images
docker images
# Entrer dans un container en bash
docker exec -it db bash ==> db étant le container name que l'on retrouve en faisant docker ps
# Docker compose a une facheuse tendance à conserver des config entre chaque lancement (comme la config de la BDD)
# si par exemple, on arrive pas à se connecter à la BDD à cause d'un Access Denied, il faut faire:
docker-compose rm -v
Docker sync va créer des containers intermédiaires qui contiendront le code de l'application. Ces containers seront synchronisés avec le code de la machine hôte. La stack "normale" ira récupérer le code dans ces containers et plus directement sur la machine hôte == gain de temps en lecture/écriture
Créer un fichier docker-sync.yml contenant les dossiers à synchroniser : pour mac privilégier la stratégie native_osx (par défaut) pour le code de l'application. Pour les vendors et node paquets, préférer le Rsync.
Ce fichier contiendra la surcharge nécessaire pour faire correspondre les emplacements du code/vendors avec les volumes externes se rapportant aux containers crées par le docker-sync.
docker-compose stop
docker-sync stop
docker-sync clean
Il faut pouvoir supprimer tous les volumes qui ont été générés par un docker-sync précédent : pour cela on commence par supprimer les containers utilisant les volumes via 3 commandes :
docker ps -as === liste les containers
docker volume ls === liste les volumes
docker rm app === supprime un container
Si on est sur MAC, le docker deskop fournit une interface graphique qui nous aide à faire cette opération.
Une fois tous les containers désirés supprimés, on supprime les volumes qui ne sont utilisés par aucun container docker volume prune
Une fois que tout est clean, on commence par faire un docker-compose up On se connecte à chaque container possédant un dossier vendor/node_modules et on passe les commandes composer install ou npm/yarn install (idem si bower)
Une fois l'install ok, on stop docker-compose : docker-compose stop
On peut alors lancer
docker-sync-stack start