Il existe une étendue de services définie dans docker-compose.yml. Ces services ont été démarrés. Je n'ai besoin de reconstruire qu'un seul d'entre eux et de le démarrer sans utiliser d'autres services. Je lance les commandes suivantes:
docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx
docker-compose up -d --no-deps # link nginx to other services
À la fin, je suis un vieux conteneur Nginx. Au fait, docker-compose ne tue pas tous les conteneurs en cours d'exécution!
$docker-compose up -d --no-deps --build <service_name>
--no-deps - Ne démarrez pas les services liés.
--build - Construit des images avant de commencer les conteneurs.
Avec docker-compose 1.19
docker-compose up -d --force-recreate --build
Dans le menu d'aide
Options:
-d Detached mode: Run containers in the background,
print new container names. Incompatible with
--abort-on-container-exit.
--force-recreate Recreate containers even if their configuration
and image haven't changed.
--build Build images before starting containers.
Cela devrait résoudre votre problème:
docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently
docker-compose up # builds/rebuilds all not already built container
Comme @HarlemSquirrel l’a signalé, c’est le meilleur et je pense la bonne solution.
Mais, pour répondre au problème spécifique de l'OP, il devrait ressembler à la commande suivante, car il ne veut pas recréer TOUS les services dans le fichier docker-compose.yml
, mais uniquement le nginx
:
docker-compose up -d --force-recreate --no-deps --build nginx
Description des options:
Options:
-d Detached mode: Run containers in the background,
print new container names. Incompatible with
--abort-on-container-exit.
--force-recreate Recreate containers even if their configuration
and image haven't changed.
--build Build images before starting containers.
--no-deps Don't start linked services.
Le problème est:
$ docker-compose stop nginx
n'a pas fonctionné (vous avez dit qu'il fonctionne toujours). Si vous voulez quand même le reconstruire, vous pouvez essayer de le tuer:
$ docker-compose kill nginx
Si cela ne fonctionne toujours pas, essayez de l'arrêter directement avec docker:
$ docker stop nginx
ou le supprimer
$ docker rm -f nginx
Si cela ne fonctionne toujours pas, vérifiez votre version de docker, vous voudrez peut-être mettre à niveau.
Cela pourrait être un bug, vous pouvez vérifier si celui-ci correspond à votre système/version. Voici un couple, par exemple: https://github.com/docker/docker/issues/10589
https://github.com/docker/docker/issues/12738
En guise de solution de contournement, vous pouvez essayer de tuer le processus.
$ ps aux | grep docker
$ kill 225654 # example process id
Utilisez simplement:
docker-compose build [yml_service_name]
Remplacez [yml_service_name]
par le nom de votre service dans le fichier docker-compose.yml
. Vous pouvez utiliser docker-compose restart
pour vous assurer que les modifications sont effectuées. Vous pouvez utiliser --no-cache
pour ignorer le cache.