Arresto dei contenitori Docker in base al nome dell'immagine - Ubuntu


156

Su Ubuntu 14.04 (Trusty Tahr) sto cercando un modo per fermare un container in esecuzione e l'unica informazione che ho è il nome dell'immagine che è stato usato nel comando run Docker.

Esiste un comando per trovare tutti i contenitori in esecuzione corrispondenti che corrispondono a quel nome di immagine e fermarli?

Risposte:


211

Dopo il numero 8959 , un buon inizio sarebbe:

docker ps -a -q --filter="name=<containerName>"

Dal momento che namesi riferisce al contenitore e non il nome dell'immagine, si avrebbe bisogno di utilizzare la più recente antenato filtro Docker 1.9 , di cui koekiebox 's risposta .

docker ps -a -q  --filter ancestor=<image-name>

Come commentato di seguito da Kiril , per rimuovere quei contenitori:

stop restituisce anche i contenitori.

Quindi concatenarsi stope rmfarà il lavoro:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))

Questo è fantastico Il mio problema è che quando si rimuovono i contenitori, poiché sono bloccati, non vengono restituiti dalla finestra mobile pd. Qualche indizio su come farlo?
Kiril,

I contenitori @kiril bloccati vengono restituiti da ps -a. Contenitori rimossi ... bene vengono rimossi, non esistono più.
VonC,

1
Grazie, non ho realizzato che stop restituisce anche i contenitori. Quindi concatenare stop e rm faranno il lavoro: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
kiril

@kiril Questa è l'idea, sì.
VonC,


44

È possibile avviare il contenitore impostando un nome contenitore:

docker run -d --name <container-name> <image-name>

La stessa immagine potrebbe essere utilizzata per far girare più contenitori, quindi questo è un buon modo per avviare un contenitore. Quindi è possibile utilizzare questo nome-contenitore per interrompere, allegare ... il contenitore:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>

Mi piace molto questa soluzione. C'è un modo migliore per compilare, arrestare / rimuovere e quindi eseguire un contenitore di questo? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
Melanke,

16

Questo codice arresterà tutti i contenitori con il centesimo dell'immagine : 6 . Non sono riuscito a trovare una soluzione più semplice per quello.

docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop

O ancora più breve:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')

1
bisogno di miglioramenti :::: docker stop $ (docker ps -a | grep centos: 6 | awk '{print $ 1}')
Shailesh kumar

@Shaileshkumar Aggiunta la tua versione =)
ArgonQQ

9

Due modi per interrompere l'esecuzione di un contenitore:

1. $docker stop container_ID

2. $docker kill container_ID

È possibile ottenere contenitori in esecuzione utilizzando il comando seguente:

$docker ps

Link seguenti per ulteriori informazioni:


L'ultimo link è interrotto ( "Siamo spiacenti, non siamo in grado di trovare quella pagina" ).
Peter Mortensen,

È letteralmente $docker? O viene $dal prompt della shell?
Peter Mortensen,

2

Per Docker versione 18.09.0 ho scoperto che il flag di formato non sarà necessario

docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))

2

Arresta il contenitore docker per nome immagine:

imagename='mydockerimage'
docker stop $(docker ps | awk '{split($2,image,":"); print $1, image[1]}' | awk -v image=$imagename '$2 == image {print $1}')

Arresta il contenitore docker per nome immagine e tag:

imagename='mydockerimage:latest'
docker stop $(docker ps | awk -v image=$imagename '$2 == image {print $1}')

Se hai creato l'immagine, puoi aggiungere un'etichetta e filtrare i contenitori in esecuzione per etichetta

docker ps -q --filter "label=image=$image"

Metodi inaffidabili

docker ps -a -q  --filter ancestor=<image-name>

non sempre funziona

docker ps -a -q --filter="name=<containerName>"

filtra per nome contenitore, non per nome immagine

docker ps | grep <image-name> | awk '{print $1}'

è problematico poiché il nome dell'immagine potrebbe apparire in altre colonne per altre immagini


1

Ho creato un nome /usr/local/bin/docker.stopche contiene il nome dell'immagine (presuppone che tu ne abbia solo uno in esecuzione).

docker stop $(docker ps -q -f "name=$1")

1

Stavo cercando di avvolgere i miei comandi Docker nelle attività gulp e mi sono reso conto che puoi fare quanto segue:

docker stop container-name
docker rm container-name

Questo potrebbe non funzionare per scenari in cui hai più contenitori con lo stesso nome (se possibile), ma per il mio caso d'uso è stato perfetto.


1

Nel mio caso --filter ancestor=<image-name>non funzionava, quindi il seguente comando ha ripulito il contenitore Docker per me:

docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))

1

elenca tutti i contenitori con informazioni e ID

docker ps

docker stop CONTAINER ID

1

Aggiungendo in cima alla superba risposta di @VonC, ecco una funzione ZSH che puoi aggiungere al tuo file .zshrc:

dockstop() {
  docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="{{.ID}}"))
}

Quindi nella riga di comando, fai semplicemente dockstop myImageNamee si fermerà e rimuoverà tutti i contenitori che sono stati avviati da un'immagine chiamata myImageName.


0
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

Questo dovrebbe bastare.


0

uso: contenitore docker stop $ (contenitore docker ls -q - filtro antenato = mongo)

    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    d394144acf3a        mongo               "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       0.0.0.0:27017->27017/tcp   magical_nobel
    (base) :~ user$ docker container stop $(docker container ls -q --filter ancestor=mongo)
    d394144acf3a
    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    (base) :~ user$

0

Se vuoi preferire un AWKapproccio semplice , ecco la mia opinione:

docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - stampa i nomi dei contenitori della finestra mobile in base all'immagine di input

docker ps - elenca tutti i contenitori

awk '{ if($2 == "<your-image-name>") { print $NF}}'- La seconda colonna analizzata di docker psfornisce il nome dell'immagine. Comparandolo con il nome dell'immagine verrà eseguita la print $NFstampa del nome del contenitore.

docker rm -f rimuove i contenitori

Ad esempio, rimuovere tutti i contenitori in esecuzione dell'immagine ubuntu, può essere fatto semplicemente come:

docker rm -f $(docker ps | awk '{ if($2 == "ubuntu:latest") { print $NF}}')

PS: ricorda di includere il tag immagine in AWK, poiché è un comparatore uguale.


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.