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?
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.
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
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
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
La simple commande 'docker' ne sait rien du conteneur 'worker'. Utilisez une commande comme celle-ci
docker-compose -f docker-compose.yml restart worker
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
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
.
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.
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.
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
).
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.