J'ai un docker-compose.yml
fichier qui contient 4 conteneurs: redis, postgres, api, worker
Lors du développement de Worker, j'ai souvent besoin de le redémarrer pour appliquer des modifications. Existe-t-il un bon moyen de redémarrer un conteneur (par exemple worker
) sans redémarrer les autres conteneurs?
docker
docker-compose
Bryan Chen
la source
la source
Réponses:
C'est très simple: utilisez la commande:
Vous pouvez définir le temps d'attente pour l'arrêt avant de tuer le conteneur (en secondes)
Notez que cela redémarrera le conteneur mais sans le reconstruire. Si vous souhaitez appliquer vos modifications puis redémarrer, consultez les autres réponses.
la source
docker-compose restart
commandes n'appliqueront aucune modification. "Si vous apportez des modifications à votredocker-compose.yml
configuration, ces modifications ne sont pas répercutées après l'exécution de cette commande." Utilisez doncdocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
n'applique pas les modifications même si vous avez déjà exécuté undocker-compose build <container name>
et il s'agit d'une réponse non fonctionnelle / incorrecte.Les autres réponses au redémarrage d' un noeud unique est sur la cible,
docker-compose restart worker
. Cela fera rebondir ce conteneur, mais n'inclura aucune modification, même si vous l'avez reconstruit séparément. Vous pouvez manuellementstop
,rm
,create
etstart
, mais il y a beaucoup de méthodes plus faciles.Si vous avez mis à jour votre code, vous pouvez faire la construction et recharger en une seule étape avec:
Cela va d'abord reconstruire vos images à partir de n'importe quel code modifié, ce qui est rapide s'il n'y a pas de changements puisque le cache est réutilisé. Et puis il ne remplace que les conteneurs modifiés. Si vos images téléchargées sont périmées, vous pouvez faire précéder la commande ci-dessus avec:
Pour télécharger d'abord les images modifiées (les conteneurs ne seront pas redémarrés tant que vous n'aurez pas exécuté une commande comme celle
up
ci - dessus). Faire un arrêt initial 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:
Voici un exemple rapide de la première option, le Dockerfile est structuré pour garder les parties du code qui changent fréquemment près de la fin. En fait, les exigences sont extraites séparément pour le,
pip install
car 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:la source
-no-cache
option? Disons que j'ai ajouté quelque chose dans monpackage.json
et que je dois le faireRUN npm install
mais que leDockerfile
lui - même n'a pas changéCOPY
commande, cela cassera automatiquement le cache.COPY
commande dans votre Dockerfile. Legit pull
mettra à jour le fichier package.json et le cache de génération se brisera lorsque le docker vous verra copier dans un autre fichier.ADD
au lieu deCOPY
mais apparemment, ce dernier est une meilleure pratique, donc je vais y aller!ADD
aura le même résultat queCOPY
sur le cache du cache, mais (comme suggéré dans le lien des meilleures pratiques) la plupart n'ont pas besoin des capacités supplémentaires, donc je ne me donne même pas la peine de le mentionner.Pour redémarrer un service avec des modifications, voici les étapes que j'ai effectuées:
la source
docker-compose up -d --build
et il reconstruira tout et redémarrera tous les conteneurs modifiés. Pas besoin d'arrêter d'abord, avec des temps d'arrêt, et des commandes de création et de démarrage séparées.up
testament n'a recréé que le conteneur qui avait été modifié et avait donc besoin d'un redémarrage.Commande suivante
va simplement arrêter et démarrer le conteneur. c'est-à-dire sans charger aucune modification depuis le docker-compose.xml
STOP est similaire à l'hibernation sur PC. Par conséquent, stop / start ne recherchera 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)
Les commandes seront donc les suivantes
la source
rm
option de ligne-f
est pratique (pas d'invite) et avec le docker actuelcreate
etstart
est fusionné commeup
(donc au total nous avons 3 commandes et non 4), et pour l'up
option-d
est utile (l'exécution est en arrière-plan).Redémarrez le service avec le fichier docker-compose
Cas d'utilisation n ° 1: si COMPOSE_FILE_NAME est
docker-compose.yml
et le service est travailleurCas d'utilisation n ° 2: si le nom du fichier est
sample.yml
et que le service est travailleurPar défaut, docker-compose recherche
docker-compose.yml
si nous exécutons ladocker-compose
commande, sinon nous avons un indicateur pour donner un nom de fichier spécifique avec-f [FILE_NAME].yml
la source
La simple commande «docker» ne sait rien du conteneur «travailleur». Utilisez une commande comme celle-ci
docker-compose -f docker-compose.yml restart worker
la source
Redémarrez le conteneur
Si vous souhaitez simplement redémarrer votre conteneur:
docker-compose restart servicename
Considérez cette commande comme «redémarrez simplement le conteneur par son nom», ce qui équivaut à la
docker restart
commande.Notez les mises en garde:
Si vous avez modifié les variables ENV, elles ne seront pas mises à jour dans le conteneur. Vous devez l'arrêter et recommencer. Ou, l'utilisation d'une seule commande
docker-compose up
détectera les modifications et recréera le conteneur.Comme beaucoup d'autres l'ont mentionné, si vous avez modifié le
docker-compose.yml
fichier lui-même, un simple redémarrage n'appliquera pas ces changements.Si vous copiez votre code à l'intérieur du conteneur au stade de la construction (à l'
Dockerfile
aide deADD
ou deCOPY
commandes), chaque fois que le code change, vous devez reconstruire le conteneur (docker-compose build
).Corrélation avec votre code
docker-compose restart
devrait fonctionner parfaitement bien, si votre code obtient un chemin mappé dans la directive conteneur par volume de ladocker-compose.yml
manière suivante:Mais je recommanderais d'utiliser le rechargement de code en direct, qui est probablement fourni par votre framework de choix en mode DEBUG (vous pouvez également rechercher des packages de rechargement automatique dans la langue de votre choix). L'ajout de cela devrait éliminer la nécessité de redémarrer le conteneur à chaque fois après que votre code change, au lieu de recharger le processus à l'intérieur.
la source
La réponse ici parle de la réflexion du changement sur le fichier docker-compose.yml.
Mais que se passe-t-il si je veux incorporer les modifications que j'ai apportées à mon code, et je crois que cela ne sera possible qu'en reconstruisant l'image et que je fais avec les commandes suivantes
1. arrêt du conteneur docker
2. retrait du conteneur docker
3. suppression d'image docker
4. composez à nouveau le conteneur
la source