Comment reconstruire le conteneur Docker dans docker-compose.yml?

218

Il existe des services qui sont définis dans docker-compose.yml. Ces services ont été lancés. Je dois reconstruire un seul d'entre eux et le démarrer sans d'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

À la fin, j'ai obtenu le vieux conteneur nginx. Par ailleurs, docker-compose ne tue pas tous les conteneurs en cours d'exécution!

yuklia
la source
4
docker-compose up --build
Jinna Balu

Réponses:

235

docker-compose up

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

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

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

denov
la source
19
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é docker-compose up -d --no-deps --build <service_name>
créés
33
@evgpisarchik Les commandes sont un peu en retrait, ça devrait êtredocker-compose build --no-cache service1 service2
Matthew Wilcoxson
185

Avec docker-compose 1.19 up

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

Sans un ou plusieurs service_namearguments, tous les conteneurs seront reconstruits

Depuis 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.
HarlemSquirrel
la source
4
Je ne sais pas comment cela répond à la question. Comment reconstruisons-nous un seul conteneur?
Duncan Jones
11
Vous ne pouvez reconstruire qu'un seul conteneur en ajoutant son nom à la fin de la commande. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel
Attendez une seconde, ce conteneur recrée , il n'est pas équivalent à l' build --no-cacheoption, sauf si la description de la commande est complètement fausse
Slav
67

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 
ArgonQQ
la source
12
si vous le souhaitez stopet rmtous les conteneurs, vous pouvez utiliser la commande docker-compose down. Votre solution est meilleure si vous voulez seulement vous en débarrasser.
hirowatari
Cette solution convient parfaitement à la configuration où vous ne voulez pas arrêter l'intégralité de l'application docker et recréer simplement l'un des services
bluesummers
J'ai dû exécuter docker-compose build <id/name>avant upde reconstruire le Dockerfile modifié.
Vajk Hermecz
50

Comme l'a signalé @HarlemSquirrel, c'est le meilleur et je pense que la bonne solution.

Mais, pour répondre au problème spécifique de l'OP, cela devrait être quelque chose comme la commande suivante, car il ne veut pas recréer TOUS les services dans le docker-compose.ymlfichier, mais seulement celui- nginxci:

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.
Slavik Meltser
la source
11

Peut-être que ces étapes ne sont pas tout à fait correctes, mais j'aime ceci:

arrêter docker composer: $ docker-compose down

retirer le récipient: $ docker system prune -a

démarrer docker composer: $ docker-compose up -d

Sergey Ivchenko
la source
Pratique pour éliminer toutes les ordures que vous collectez ...
jvenema Il y a
4

Utilisez simplement:

docker-compose build [yml_service_name]

Remplacez [yml_service_name]par votre nom de service dans le docker-compose.ymlfichier. Vous pouvez utiliser docker-compose restartpour vous assurer que les modifications sont effectuées. Vous pouvez utiliser --no-cachepour ignorer le cache.

FarhadMohseni
la source
2

Le problème est:

$ docker-compose stop nginx

n'a pas fonctionné (vous avez dit qu'il fonctionne toujours). Si vous allez 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 supprimez-le

$ docker rm -f nginx

Si cela ne fonctionne toujours pas, vérifiez votre version de docker, vous voudrez peut-être mettre à niveau.

Il peut s'agir d'un bug, vous pouvez vérifier si l'un correspond à votre système / version. En voici quelques exemples, 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
user2707671
la source
1

Pour moi, il n'a récupéré que les nouvelles dépendances de Docker Hub avec les deux --no-cacheet --pull(qui sont disponibles pour docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)
kmindi
la source
0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

Il est essentiel de retirer le récipient avec rm. Sans le retirer, Docker démarrera l'ancien conteneur.

Nex
la source
-9

Seulement:

$ docker-compose restart [yml_service_name]
ALEXANDER GOMEZ HIGUITA
la source
4
cela ne générera pas de nouveaux changements. du manuel - Si vous apportez des modifications à votre configuration docker-compose.yml, ces modifications ne seront pas reflétées après l'exécution de cette commande.
denov