web-dev-qa-db-fra.com

Comment redémarrer un seul conteneur avec docker-compose

J'ai un fichier docker-compose.yml qui contient 4 conteneurs: redis, postgres, api, worker

Pendant le développement de worker, je dois souvent le redémarrer pour appliquer les modifications. Existe-t-il un bon moyen de redémarrer un conteneur (par exemple worker) sans redémarrer les autres conteneurs?

253
Bryan Chen

C'est très simple: utilisez la commande:

docker-compose restart worker

Vous pouvez définir le délai d'attente avant l'arrêt du conteneur (en secondes)

docker-compose restart -t 30 worker

Notez que cela va redémarrer le conteneur mais sans le reconstruire. Si vous souhaitez appliquer vos modifications puis redémarrer, jetez un coup d'œil aux autres réponses.

314
bmkrio

Les autres réponses au redémarrage d'un seul nœud sont sur la cible, docker-compose restart worker. Cela renverra ce conteneur, mais n'inclura aucune modification, même si vous l'avez reconstruit séparément. Vous pouvez manuellement stop, rm, create et start, mais il existe des méthodes beaucoup plus simples.

Si vous avez mis à jour votre code, vous pouvez créer et recharger en une seule étape avec:

docker-compose up --detach --build

Cela reconstruira d’abord vos images à partir de tout code modifié, ce qui est rapide s’il n’ya pas de changement depuis la mise en cache du cache. Et puis, il ne remplace que les conteneurs modifiés. Si vos images téléchargées sont obsolètes, vous pouvez faire précéder la commande ci-dessus avec:

docker-compose pull

Pour télécharger d’abord les images modifiées (les conteneurs ne seront pas redémarrés tant que vous n’exécuterez pas une commande telle que la variable up ci-dessus). Faire un premier arrêt n'est pas nécessaire.

Et pour ne le faire que pour un seul service, suivez la commande up ou pull avec les services que vous souhaitez spécifier, par exemple:

docker-compose up --detach --build worker

Voici un exemple rapide de la première option, le fichier Docker est structuré de manière à conserver les parties du code qui changent fréquemment vers la fin. En fait, les exigences sont extraites séparément pour le pip install puisque ce fichier change rarement. Et comme les conteneurs nginx et redis étaient à jour, ils n’ont pas été redémarrés. Le temps total pour l'ensemble du processus était inférieur à 6 secondes:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-Alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s
136
BMitch

Pour redémarrer un service avec des modifications, voici les étapes que j'ai effectuées:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
18
Jeff

Commande suivante

docker-compose restart worker

juste arrêter et démarrer le conteneur. c'est-à-dire sans charger les modifications du fichier docker-compose.xml

STOP est similaire à l'hibernation sur PC. Par conséquent, stop/start ne cherchera aucune modification apportée au fichier de configuration. Pour recharger à partir de la recette du conteneur (docker-compose.xml), nous devons supprimer et créer le conteneur (analogie similaire au redémarrage du PC).

Donc, les commandes seront comme suit

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation
8
Mr Coder

La simple commande 'docker' ne sait rien du conteneur 'worker'. Utilisez une commande comme celle-ci

docker-compose -f docker-compose.yml restart worker

5
Shtlzut

Redémarrer le service avec le fichier docker-compose

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Cas d'utilisation n ° 1: Si COMPOSE_FILE_NAME est docker-compose.yml et que le service est un agent

docker-compose restart worker

Cas d'utilisation n ° 2: Si le nom du fichier est sample.yml et que le service est worker

docker-compose -f sample.yml restart worker

Par défaut, docker-compose recherche le docker-compose.yml si nous exécutons la commande docker-compose, nous avons également un indicateur pour donner un nom de fichier spécifique avec -f [FILE_NAME].yml

5
Jinna Balu

Redémarrer le conteneur

Si vous souhaitez simplement redémarrer votre conteneur:

docker-compose restart servicename

Pensez à cette commande comme "redémarrez simplement le conteneur par son nom", ce qui équivaut à la commande docker restart.

Remarque mises en garde:

  1. Si vous avez modifié les variables ENV, elles ne seront pas mises à jour dans le conteneur. Vous devez l'arrêter et recommencer. Ou bien, en utilisant la commande unique docker-compose up détectera les modifications et recréera le conteneur.

  2. Comme beaucoup d'autres l'ont mentionné, si vous avez modifié le fichier docker-compose.yml lui-même, un simple redémarrage n'appliquera pas ces modifications.

  3. Si vous copiez votre code dans le conteneur au stade de la construction (dans les commandes Dockerfile à l'aide de ADD ou COPY, vous devez reconstruire le conteneur à chaque fois que le code est modifié (docker-compose build ).

Corrélation avec votre code

docker-compose restart devrait fonctionner parfaitement, si votre code obtenait le chemin mappé dans la directive conteneur par volume dans docker-compose.yml comme ceci:

services:

  servicename:
    volumes:
      - .:/code

Mais je vous recommanderais d'utiliser le rechargement en direct, qui est probablement fourni par votre framework de choix en mode DEBUG (vous pouvez également rechercher des packages à recharge automatique dans la langue de votre choix). L'ajout de cela devrait éliminer le besoin de redémarrer le conteneur chaque fois que votre code a été modifié, mais de recharger le processus à l'intérieur.

0
Lev Rubel