Je veux lancer un script, juste après avoir exécuté
`docker-compose up -d`
Voici mon extrait de docker-compose.yml
. Les autres paramètres sont mysql server, redis ... etc .... mais ils ne posent aucun problème
web:
image: nginx
container_name: web-project
volumes:
- ./code:/srv
working_dir: /srv/myweb
extra_hosts:
- "myweb.local:127.0.0.1"
ports:
- 8081:80
# tty: true
command: sh /srv/scripts/post-run-web.sh
Donc, chaque fois que je lance docker-compose up -d
Ou docker-compose up
Tout s'arrête. (les conteneurs ne continuent pas à courir). Bien que mon script shell soit simple (echos en cours d'exécution ... ou phpunit). Voici mon script.
#!/bin/bash
echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
Et c'est l'erreur que j'ai. C'est comme si le serveur (nginx) ne fonctionnait pas encore. Aussi, si je me connecte au serveur en utilisant exec bash, et que je vérifie les processus. Je ne vois pas nginx en cours d'exécution (pour le moment).
web_1 | You are already using composer version 7a9eb02190d334513e99a479510f87eed18cf958.
web_1 | Loading composer repositories with package information
web_1 | Updating dependencies (including require-dev)
web_1 | Generating autoload files
web-project exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping mysql-project... done
Stopping rabbitmq-project... done
Stopping redis-project... done
Alors, pourquoi quitte-t-il, alors que le script est syntaxiquement correct? Comment puis-je le faire fonctionner correctement? (qu'est-ce que je fais, m'arrange mal!)
commande remplace la commande par défaut.
C’est la raison pour laquelle votre conteneur s’arrête: nginx ne démarre jamais.
À la fin de votre script, vous devez exécuter nginx
#!/bin/bash
echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
nginx
Au fait, je vous suggère de changer votre script et d’exécuter npm install
et composer *update
uniquement si nécessaire (donc si un fichier dans/src/myweb n’existe pas), car il augmente en vain le temps de démarrage de votre conteneur.
Notez que, ce faisant, NginX ne capturera jamais le signal SIGTERM envoyé par docker stop. Cela peut provoquer sa mort brutale.
Au lieu de cela, si vous voulez être sûr que SIGTERM soit reçu par nginx, vous devez remplacer la dernière ligne par exec nginx
. Ceci remplace le processus bash par nginx lui-même.