Parando contêineres do Docker pelo nome da imagem - Ubuntu

156

No Ubuntu 14.04 (Trusty Tahr), estou procurando uma maneira de parar um contêiner em execução e as únicas informações que tenho são o nome da imagem que foi usada no comando Docker run.

Existe um comando para encontrar todos os contêineres em execução correspondentes que correspondam ao nome da imagem e pará-los?

Collin Estes
fonte

Respostas:

210

Após a edição 8959 , um bom começo seria:

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

Desde namerefere-se ao recipiente e não o nome da imagem, você precisa usar o mais recente ancestral filtro Docker 1.9 , mencionado no koekiebox 's resposta .

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

Como comentado abaixo por kiril , para remover esses contêineres:

stop retorna os contêineres também.

Então encadeamento stope rmfará o trabalho:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))
VonC
fonte
Isso é ótimo. Meu problema depois disso é ao remover os contêineres, uma vez que eles são bloqueados, eles não são retornados pelo docker pd. Alguma pista de como fazê-lo?
Kiril
O contêiner parado @kiril é retornado por ps -a. Recipientes removidos ... bem, eles são removidos, não existem mais.
VonC
1
Obrigado, eu não percebi parar de devolver os contêineres também. Então encadeamento parada e rm irá fazer o trabalho: estivador rm $ (paragem $ estivador (estivador ps -a q --filter = "name = <imageName>"))
Kiril
@kiril Essa é a ideia, sim.
VonC
63

As respostas anteriores não funcionaram para mim, mas isso funcionou:

docker stop $(docker ps -q --filter ancestor=<image-name> )
Koekiebox
fonte
1
Uso interessante do ancestral lá ( docs.docker.com/engine/reference/commandline/ps/#filtering ). 1
VonC
1
Também funciona no Docker Terminal para Windows.
Koekiebox
44

Você pode iniciar o contêiner definindo um nome de contêiner:

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

A mesma imagem pode ser usada para girar vários contêineres, portanto, é uma boa maneira de iniciar um contêiner. Então você pode usar esse nome de contêiner para parar, anexar ... o contêiner:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>
Javier Sánchez
fonte
Eu realmente gosto desta solução. Existe uma maneira melhor de criar, parar / remover e executar um contêiner que esse? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke 12/09/19
16

Este código irá parar todos os contêineres com a imagem centos: 6 . Não consegui encontrar uma solução mais fácil para isso.

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

Ou ainda mais curto:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
ArgonQQ
fonte
1
precisa melhorar :::: docker stop $ (docker ps -a | grep centos: 6 | awk '{print $ 1}')
Shailesh kumar
@Shaileshkumar Adicionou sua versão =)
ArgonQQ
9

Duas maneiras de parar de executar um contêiner:

1. $docker stop container_ID

2. $docker kill container_ID

Você pode executar contêineres usando o seguinte comando:

$docker ps

Links a seguir para obter mais informações:

Kalyani Chaudhari
fonte
O último link está quebrado ( "Desculpe, não conseguimos encontrar essa página" ).
Peter Mortensen
É literalmente $docker? Ou é $do prompt do shell?
Peter Mortensen
2

Para o Docker versão 18.09.0, descobri que o sinalizador de formato não será necessário

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

Pare o contêiner do Docker pelo nome da imagem:

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

Pare o contêiner do docker por nome e tag da imagem:

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

Se você criou a imagem, poderá adicionar uma etiqueta a ela e filtrar os contêineres em execução por etiqueta.

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

Métodos não confiáveis

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

nem sempre funciona

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

filtra pelo nome do contêiner, não pelo nome da imagem

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

é problemático, pois o nome da imagem pode aparecer em outras colunas para outras imagens

Jay
fonte
1

Eu fiz um /usr/local/bin/docker.stopque leva o nome da imagem (assume que você tem apenas um em execução).

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

Eu estava tentando envolver meus comandos do Docker em tarefas gulp e percebi que você pode fazer o seguinte:

docker stop container-name
docker rm container-name

Isso pode não funcionar para cenários em que você tenha vários contêineres com o mesmo nome (se isso for possível), mas, para o meu caso de uso, foi perfeito.

Matt Gaunt
fonte
1

No meu caso, --filter ancestor=<image-name>não estava funcionando, então o comando a seguir limpou o contêiner do Docker para mim:

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

listar todos os contêineres com informações e ID

docker ps

docker stop CONTAINER ID
Muhammed Moussa
fonte
1

Adicionando sobre a excelente resposta do @VonC, aqui está uma função ZSH que você pode adicionar ao seu arquivo .zshrc:

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

Em sua linha de comando, basta fazer dockstop myImageNamee ele irá parar e remover todos os contêineres que foram iniciados a partir de uma imagem chamada myImageName.

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

Isso deve ser suficiente.

Berkay Kırmızıoğlu
fonte
0

use: container docker stop $ (container docker ls -q --filter ancestor = 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$
CINZA
fonte
0

Se você preferir uma AWKabordagem simples , aqui está a minha opinião:

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - imprime os nomes dos contêineres do docker com base na imagem de entrada

docker ps - listar todos os contêineres

awk '{ if($2 == "<your-image-name>") { print $NF}}'- A segunda coluna analisada de docker psfornece o nome da imagem. Comparando-o com o nome da sua imagem, será executado o print $NFque imprime o nome do contêiner.

docker rm -f remove os recipientes

Por exemplo, remover todos os contêineres em execução da imagem do ubuntu, pode ser feito simplesmente como:

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

PS: Lembre-se de incluir a tag da imagem no AWK, pois é um comparador igual.

ashutosh
fonte
-5

Você pode usar o pscomando para dar uma olhada nos contêineres em execução:

docker ps -a

A partir daí, você deverá ver o nome do seu contêiner junto com o ID do contêiner que procura. Aqui está mais informações sobredocker ps .

Aaron Tracy
fonte
O link está quebrado ( Desculpe, não conseguimos encontrar essa página ).
Peter Mortensen