Come ricostruire il contenitore docker in docker-compose.yml?


218

Esistono dei servizi definiti in docker-compose.yml. Questi servizi sono stati avviati. Ho bisogno di ricostruire solo uno di questi e avviarlo senza altri servizi. Eseguo i seguenti comandi:

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

Alla fine ho preso il vecchio contenitore di nginx. A proposito docker-compose non uccide tutti i container in esecuzione!


4
docker-compose up --build
Jinna Balu,

Risposte:


234

docker-compose up

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

--no-deps - Non avviare i servizi collegati.

--build - Crea immagini prima di avviare i contenitori.


19
docker-compose build service1 service2 --no-cache fa meglio questo lavoro ( github.com/docker/compose/issues/1049 ). Ho avuto un problema con i contenitori memorizzati nella cache che sono stati costruiti prima dell'uso docker-compose up -d --no-deps --build <service_name>
evgpisarchik

33
@evgpisarchik Gli ordini un po 'fuori, dovrebbe esseredocker-compose build --no-cache service1 service2
Matthew Wilcoxson

183

Con docker-compose 1.19 up

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

Senza uno o più service_nameargomenti, tutti i contenitori verranno ricostruiti

Dal menu di aiuto

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.

4
Sono confuso su come questo risponda alla domanda. Come ricostruire solo un container?
Duncan Jones,

11
È possibile ricostruire un solo contenitore aggiungendo il nome alla fine del comando. docker-compose up -d --force-recreate --build container_name
Harlem Squirrel

Aspetta un secondo, questo ricrea il contenitore , non equivale build --no-cacheall'opzione, a meno che la descrizione del comando non sia completamente sbagliata
Slav

67

Questo dovrebbe risolvere il tuo problema:

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 

12
se si desidera stope rmtutti i contenitori quindi è possibile utilizzare il comando docker-compose down. La tua soluzione è migliore se vuoi solo liberartene.
hirowatari,

Questa soluzione è adatta per l'installazione in cui non si desidera interrompere l'intera applicazione docker e ricreare uno dei servizi
bluesummers

Avevo bisogno di correre docker-compose build <id/name>prima updi ricostruire il Dockerfile modificato.
Vajk Hermecz,

50

Come ha pubblicato @HarlemSquirrel, è la migliore e penso che sia la soluzione corretta.

Ma, per rispondere al problema specifico dell'OP, dovrebbe essere qualcosa come il seguente comando, poiché non vuole ricreare TUTTI i servizi nel docker-compose.ymlfile, ma solo nginxquello:

docker-compose up -d --force-recreate --no-deps --build nginx

Descrizione delle opzioni:

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.

9

Forse questi passaggi non sono del tutto corretti, ma mi piace così:

stop docker compose: $ docker-compose down

rimuovere il contenitore: $ docker system prune -a

avvia la finestra mobile componi: $ docker-compose up -d


4

Usa semplicemente:

docker-compose build [yml_service_name]

Sostituisci [yml_service_name]con il nome del tuo servizio nel docker-compose.ymlfile. È possibile utilizzare docker-compose restartper assicurarsi che le modifiche vengano eseguite. È possibile utilizzare --no-cacheper ignorare la cache.


2

Il problema è:

$ docker-compose stop nginx

non ha funzionato (hai detto che è ancora in esecuzione). Se lo ricostruirai comunque, puoi provare a ucciderlo:

$ docker-compose kill nginx

Se continua a non funzionare, prova a interromperlo direttamente con la finestra mobile:

$ docker stop nginx

o cancellalo

$ docker rm -f nginx

Se il problema persiste, controlla la tua versione della finestra mobile, potresti voler aggiornare.

Potrebbe essere un bug, puoi verificare se uno corrisponde al tuo sistema / versione. Eccone un paio, ad esempio: https://github.com/docker/docker/issues/10589

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

Per ovviare al problema, potresti provare a terminare il processo.

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

1

Per me ha recuperato solo nuove dipendenze dall'hub Docker con entrambi --no-cachee --pull(che sono disponibili per 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)

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

La rimozione del contenitore con rm è essenziale. Senza rimuovere, Docker avvierà il vecchio contenitore.


-9

Solo:

$ docker-compose restart [yml_service_name]

4
questo non comporterà nuove modifiche. dal manuale: se si apportano modifiche alla configurazione docker-compose.yml, queste modifiche non si rifletteranno dopo aver eseguito questo comando.
denov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.