web-dev-qa-db-fra.com

Comment arrêter tous les conteneurs lorsqu'un conteneur s'arrête avec docker-compose?

Jusqu'à récemment, quand on faisait docker-compose up pour un tas de conteneurs et l'un des conteneurs démarrés s'est arrêté, tous les conteneurs ont été arrêtés. Ce n'est plus le cas depuis https://github.com/docker/compose/issues/741 et c'est vraiment très ennuyeux pour nous: nous utilisons docker-compose pour exécuter des tests Selenium ce qui signifie commencer serveur d'applications, démarrage du concentrateur Selenium + nœuds, démarrage du pilote de test, puis sortie lorsque le pilote de test s'arrête.

Existe-t-il un moyen de retrouver un ancien comportement?

33
insitu

Vous pouvez utiliser:

docker-compose up --abort-on-container-exit

Qui arrêtera tous les conteneurs si l'un de vos conteneurs s'arrête

63
Metalstorm

Avez-vous essayé le travail proposé sur le lien que vous avez fourni?

En supposant que votre script de test ressemble à ceci:

$ docker-compose rm -f
$ docker-compose build
$ docker-compose up --timeout 1 --no-build

À la fin des tests d'application, la composition se termine et les tests se terminent.

Dans ce cas, avec le nouveau docker-compose version, changez votre conteneur de test pour avoir une commande no-op par défaut (quelque chose comme echo ou true), et changez votre script de test comme suit:

$ docker-compose rm -f
$ docker-compose build
$ docker-compose up --timeout 1 --no-build -d
$ docker-compose run tests test_command...
$ docker-compose stop

L'utilisation de run vous permet d'obtenir l'état de sortie du test et vous ne voyez que la sortie des tests (pas toutes les dépendances).

Référence

Si cela n'est pas acceptable, vous pouvez vous référer à Docker Remote API et surveiller l'événement stop pour les conteneurs et agir en conséquence.

Un exemple d'utilisation est cet docker-gen outil écrit en golang qui surveille les événements de démarrage du conteneur , pour régénérer automatiquement les fichiers de configuration.

5
Vincent De Smet

Dans votre fichier de composition Docker, configurez votre conteneur de pilote de test pour qu'il dépende des autres conteneurs (avec depends_on paramètre). Votre fichier de composition Docker devrait ressembler à ceci:

services:
  application_server:
     ...
  Selenium:
     ...
  test_driver:
    entry_point: YOUR_TEST_COMMAND
    depends_on:
      - application_server
      - Selenium

Avec les dépendances exprimées de cette façon, exécutez:

docker-compose run test_driver

et tous les autres conteneurs s'arrêteront lorsque le test_driver le conteneur est terminé.



Cette solution est une alternative au docker-compose up --abort-on-container-exitréponse . Ce dernier fermera également tous les autres conteneurs si l'un d'eux se termine (pas seulement le pilote de test ). Cela dépend de votre cas d'utilisation lequel est le plus adéquat.

5
Jakub Kukul

Je ne suis pas sûr que ce soit la réponse parfaite à votre problème, mais maestro pour Docker, vous permet de gérer plusieurs conteneurs Docker comme une seule unité.

Cela devrait vous sembler familier lorsque vous les regroupez à l'aide d'un fichier YAML.

0
taco