docker run -> 'name já está sendo usado pelo contêiner'

387

A execução do dockerregistro com o comando abaixo sempre gera um erro:

dev:tmp me$ docker run \
     -d --name registry-v1 \
     -e SETTINGS_FLAVOR=local \
     -e STORAGE_PATH=/registry \
     -e SEARCH_BACKEND=sqlalchemy \
     -e LOGLEVEL=DEBUG \
     -p 5000:5000 \
     registry:0.9.1
Error response from daemon: Conflict. The name "registry-v1" is already in use by container f9e5798a82e0. You have to delete (or rename) that container to be able to reuse that name.

Como evitar esse erro?

Rubytastic
fonte

Respostas:

427

Fiquei confuso com isso também. Existem dois comandos relevantes aqui:

docker run Execute um comando em um novo contêiner

docker start Iniciar um ou mais contêineres parados

Walt Howard
fonte
8
Esta é a resposta que eu estava procurando para executar novamente um contêiner do Docker. Obrigado!
Isapir
105
Portanto, também é importante usar docker ps -apara ver todos os contêineres neste caso.
Sławosz
9
sim, docker start -a container-nameé o comando que você pode usar para iniciar um contêiner que foi criado docker run. Observe a -abandeira que é uma abreviação para --attach. Dessa forma, o contêiner é iniciado em primeiro plano, exatamente como quando você usa docker run(que executa um contêiner em primeiro plano por padrão).
Krzysztof Wołowski
11
@Suncatcher Sim.
0x7d7b 9/10/19
11
@ eMPee584 Não, porque docker create cria um contêiner, mas não o executa.
0x7d7b 9/10/19
182

Isso significa que você já começou um recipiente no passado com o parâmetro docker run --name registry-v1 ....

Você precisa excluir isso primeiro antes de recriar um contêiner com o mesmo nome docker rm registry-v1. Quando o contêiner estiver em execução no peitoril, você deverá primeiro pará-lo antes de poder excluí-lo docker stop registry-v1. Ou simplesmente escolha um nome diferente para o novo contêiner.

Para obter uma lista de contêineres existentes e seus nomes, basta chamar docker ps -a.

0x7d7b
fonte
4
Mas por que os que estão parados? Ou o que é bom se eles ainda estiverem lá se forem parados?
mskw
2
Para que você possa executá-los mais tarde, sem recriá-los
Scott Stensland
2
Então você está basicamente dizendo "para que você possa EXECUTAR a imagem uma vez (ou seja, produzir o contêiner e executar o comando nele), em seguida, INICIE o contêiner quantas vezes desejar". Mas por que precisamos executar algo apenas uma vez? Sem persistir as possíveis alterações que "algo" fez no contêiner (lembre-se, as alterações no estado do contêiner do docker são perdidas, a menos que sejam confirmadas).
Maksim Gumerov
14
Se você sabe o nome de seu recipiente que você pode removê-lo usando este atalhodocker rm $(docker ps -aq --filter name=myContainerName)
Jujhar Singh
2
@JujharSingh Por que não apenas docker rm myContainerName?
Rodrigo
153

Aqui o que eu fiz, funciona bem.

Etapa 1: (lista o container docker com seu nome)

docker ps -a

passo 2:

docker rm name_of_the_docker_container
Thavaprakash Swaminathan
fonte
4
Isso foi útil para mim, o "docker ps" sem querer precisa de um sinalizador para retornar qualquer coisa.
22619 MichaelChan #
O docker ps retorna apenas os contêineres em execução e precisa de -a para listar até os parados.
Surendra Pratap
57

Apenas para explicar o que os outros estão dizendo (demorei algum tempo para entender) é que, simplesmente, quando você vê esse erro, significa que você já tem um contêiner e o que precisa fazer é executá-lo. Embora intuitivamente docker rundeva executá-lo, não o faz. O comando docker runé usado apenas para iniciar um contêiner pela primeira vez. Para executar um contêiner existente, o que você precisa é docker start $container-name. É demais pedir aos desenvolvedores que criem comandos significativos / intuitivos.

mithunpaul
fonte
32

Você tem 2 opções para corrigir isso ...

  1. Remova o contêiner anterior usando esse nome, com o comando docker rm $(docker ps -aq --filter name=myContainerName)

    OU

  2. Renomeie o contêiner atual para um nome diferente, ou seja, altere esta parte --name registry-v1para algo como --name myAnotherContainerName

Você está recebendo este erro porque o nome do contêiner (ou seja registry-v1) foi usado por outro contêiner no passado ... mesmo que o contêiner tenha saído, ou seja (atualmente não está em uso).

Edwin Ikechukwu Okonkwo
fonte
30

Quando você está construindo uma nova imagem, geralmente deseja executar um novo contêiner a cada vez e com o mesmo nome. Eu achei a maneira mais fácil foi iniciar o contêiner com a opção --rm :

--rm        Automatically remove the container when it exits

por exemplo

docker run --name my-micro-service --rm <image>

Infelizmente, é usado quase aleatoriamente nos exemplos dos documentos

Martin
fonte
imagem ou recipiente?
Pim Heijden
11
Os contêineres são executados a partir de imagens criadas. Aproximadamente semelhante à definição de classe (imagem) e instância de classe (contêiner).
Martin Martin
Primeiro você diz container, depois imagem. Isso não está claro. Além disso, se um contêiner para essa imagem já estiver em execução, ele permanecerá em execução após o uso --rm. Não reinicia.
Pim Heijden
4
Apenas uma observação: --rmsó funciona se você tiver criado o contêiner usando a --rmbandeira. Isso significa que, se você criou o contêiner sem a --rmbandeira, precisará removê-lo manualmente antes de poder tirar vantagem da rmbandeira.
lepe 22/03
18

Causa

Um contêiner com o mesmo nome ainda existe.

Solução

Para reutilizar o mesmo nome de contêiner, exclua o contêiner existente:

docker rm <container name>

Explicação

Os contêineres podem existir nos seguintes estados, durante os quais o nome do contêiner não pode ser usado para outro contêiner:

  • created
  • restarting
  • running
  • paused
  • exited
  • dead

Você pode ver os contêineres no runningestado usando:

docker ps

Para mostrar contêineres em todos os estados e descobrir se o nome de um contêiner foi usado, use:

docker ps -a
Roderick Jonsson
fonte
Se alguém deseja reutilizar o contêiner, então --rm não é a opção apropriada. Um simples "docker start {container name}" é suficiente.
Ken Ingram
11

Aqui está como eu resolvi isso no ubuntu 18:

  1. $ sudo docker ps -a
  2. copie o ID do contêiner

Para cada contêiner, faça:

  1. $ sudo docker stop container_ID
  2. $ sudo docker rm container_ID
Ali Faghihinia
fonte
10

Você pode removê-lo com o comando sudo docker rm YOUR_CONTAINER_IDe executar um novo contêiner com sudo docker run ...; ou reinicie um contêiner existente comsudo docker start YOUR_CONTAINER_ID

donglei
fonte
7

Resolvi o problema seguindo as etapas a seguir e espero que ajude.

  1. Digite docker ps -apara listar todos os contêineres no seu sistema.
  2. Verifique a parte NAMES em que você inicializou o contêiner do docker.
  3. Então digite docker rm --force name_of_container
  4. Instale o contêiner do docker como desejar.

Ocorreu um problema ao usar o NIFI e removi e reinstalei usando o docker. Boa sorte.

Nijat Mursali
fonte
4

Estou apenas aprendendo o docker e isso também me pegou. Já parei o contêiner com esse nome e, portanto, pensei em executar um novo contêiner com esse nome.

Não é o caso. Só porque o contêiner está parado, não significa que ele não pode ser iniciado novamente e mantém os mesmos parâmetros com os quais foi criado (incluindo o nome).

quando eu corri docker ps -a , vi todos os contêineres de teste que criei enquanto brincava.

Não tem problema, já que eu não quero mais isso, acabei de fazer docker rm containernameum ponto em que meu novo contêiner foi autorizado a executar com o nome antigo.

Ah, e agora que termino de escrever esta resposta, vejo o comentário de Slawosz na resposta de Walt Howard acima sugerindo o uso de docker ps -a

C. Tewalt
fonte