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?

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}}"))

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


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>

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}')

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:


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>))

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


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")

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.


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}}"))

1

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

docker ps

docker stop CONTAINER ID

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.


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

Isso deve ser suficiente.


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$

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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.