web-dev-qa-db-fra.com

docker-compose yml en cours d'exécution d'un script

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

32
Confidence

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.

31
nessuno