400 votes

Comment reconstruire un conteneur docker dans docker-compose.yml ?

Il y a des services définis dans le fichier docker-compose.yml. Ces services ont été lancés. J'ai besoin de reconstruire un seul d'entre eux et de le démarrer sans les autres services. J'exécute 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

A la fin, j'ai obtenu un vieux conteneur nginx. Au fait, docker-compose ne tue pas tous les conteneurs en cours d'exécution !

29 votes

docker-compose up --build

9 votes

Juste pour clarifier le commentaire supérieur : docker-compose up --build reconstruire tous les conteneurs. Utilisez docker-compose up --build <service_name> comme indiqué dans le commentaire de @denov.

0 votes

docker-compose up --build <service_name> ne fonctionne pas si vous avez un docker-compose.yml avec des conteneurs provenant d'un container-registry

465voto

denov Points 332

docker-compose up

$ docker-compose up -d --no-deps --build <service_name>

--no-deps - Ne pas démarrer les services liés.

--build - Construit les images avant de démarrer les conteneurs.

39 votes

docker-compose build service1 service2 --no-cache fait mieux ce travail ( github.com/docker/compose/issues/1049 ). J'ai eu un problème avec les conteneurs mis en cache qui ont été construits avant d'utiliser la fonction docker-compose up -d --no-deps --build <service_name>

76 votes

@evgpisarchik Les commandes sont un peu en dehors, elles devraient l'être. docker-compose build --no-cache service1 service2

326voto

HarlemSquirrel Points 1679

Avec docker-compose 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Sans un ou plusieurs service_name arguments toutes les images seront construites si elles sont manquantes et tous les conteneurs seront recréés.

Dans le menu d'aide

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.

Sans cache

Pour forcer une reconstruction à ignorer les couches mises en cache, nous devons d'abord construire une nouvelle image

docker-compose build --no-cache [<service_name>..]

Dans le menu d'aide

Options:
    --force-rm              Always remove intermediate containers.
    -m, --memory MEM        Set memory limit for the build container.
    --no-cache              Do not use cache when building the image.
    --no-rm                 Do not remove intermediate containers after a successful build.

Puis recréer le conteneur

docker-compose up --force-recreate --no-deps [-d] [<service_name>..]

5 votes

Je ne comprends pas comment cela répond à la question. Comment reconstruire un seul conteneur ?

15 votes

Vous pouvez reconstruire un seul conteneur en ajoutant son nom à la fin de la commande. docker-compose up -d --force-recreate --build container_name

0 votes

Attends une seconde, ce recrée conteneur il n'est pas équivalent à build --no-cache à moins que la description de la commande ne soit complètement fausse

83voto

ArgonQQ Points 771

Cela devrait régler 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

18 votes

Si vous voulez stop et rm tous les conteneurs alors vous pouvez utiliser la commande docker-compose down . Votre solution est meilleure si vous voulez seulement vous débarrasser de certains.

2 votes

Cette solution convient bien aux situations où vous ne voulez pas arrêter toute l'application Docker et recréer simplement un des services.

3 votes

J'avais besoin de courir docker-compose build <id/name> avant up pour reconstruire le fichier Dockerfile modifié.

4voto

user2707671 Points 51

Le problème est que :

$ docker-compose stop nginx

n'a pas fonctionné (vous avez dit qu'il fonctionne toujours). Si vous avez l'intention de le reconstruire, vous pouvez essayer de le tuer :

$ docker-compose kill nginx

Si cela ne fonctionne toujours pas, essayez de l'arrêter avec docker directement :

$ docker stop nginx

ou le supprimer

$ docker rm -f nginx

Si cela ne fonctionne toujours pas, vérifiez votre version de Docker, vous pourriez vouloir la mettre à jour.

Il peut s'agir d'un bogue, vous pouvez vérifier s'il correspond à votre système/version. En voici quelques-uns, par exemple : https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

Comme solution de contournement, vous pouvez essayer de tuer le processus.

$ ps aux | grep docker 
$ kill 225654 # example process id

-12voto

Seulement :

$ docker-compose restart [yml_service_name]

5 votes

Si vous apportez des modifications à votre configuration docker-compose.yml, ces modifications ne seront pas prises en compte après l'exécution de cette commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X