docker run -> 'nombre ya está en uso por contenedor'

387

Ejecutar el dockerregistro con el siguiente comando siempre arroja un error:

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.

¿Cómo prevenir este error?

Rubytastic
fuente

Respuestas:

427

Me confundí por esto también. Hay dos comandos relevantes aquí:

docker run Ejecuta un comando en un nuevo contenedor

docker start Inicia uno o más contenedores detenidos

Walt Howard
fuente
8
Esta es la respuesta que estaba buscando para volver a ejecutar un contenedor Docker. ¡Gracias!
isapir
105
Por lo tanto, también es importante usar docker ps -apara ver todos los contenedores en este caso.
Sławosz el
99
sí, docker start -a container-namees el comando que puede usar para iniciar un contenedor que se ha creado con docker run. Tenga en cuenta la -abandera que es la abreviatura de --attach. De esta manera, el contenedor se inicia en primer plano, al igual que cuando lo usa docker run(que ejecuta un contenedor en primer plano de forma predeterminada).
Krzysztof Wołowski
1
@Suncatcher Sí.
0x7d7b
1
@ eMPee584 No, porque docker create crea un contenedor pero no lo ejecuta.
0x7d7b
182

Eso significa que ya ha comenzado un contenedor en el pasado con el parámetro docker run --name registry-v1 ....

Debe eliminar eso primero antes de poder volver a crear un contenedor con el mismo nombre docker rm registry-v1. Cuando ese contenedor todavía se está ejecutando, debe detenerlo primero antes de poder eliminarlo docker stop registry-v1. O simplemente elija un nombre diferente para el nuevo contenedor.

Para obtener una lista de contenedores existentes y sus nombres, simplemente invoque docker ps -a.

0x7d7b
fuente
44
Pero, ¿por qué son detenidos? ¿O qué hay de bueno si todavía están allí si se detienen?
mskw
2
Para que pueda ejecutarlos más tarde sin recrearlos
Scott Stensland
2
Entonces, básicamente está diciendo "para poder EJECUTAR la imagen una vez (es decir, producir el contenedor y luego ejecutar el comando en ella), luego INICIAR el contenedor tantas veces como desee". Pero, ¿por qué necesitaríamos EJECUTAR algo solo una vez? Sin siquiera persistir los posibles cambios que "algo" hizo en el contenedor (recuerde, los cambios de estado del contenedor acoplable se pierden a menos que se confirmen).
Maksim Gumerov
14
Si conoce el nombre de su contenedor, puede eliminarlo utilizando este acceso directodocker rm $(docker ps -aq --filter name=myContainerName)
Jujhar Singh
2
@JujharSingh ¿Por qué no solo docker rm myContainerName?
Rodrigo
153

Aquí lo que hice, funciona bien.

Paso 1: (enumera el contenedor acoplable con su nombre)

docker ps -a

paso 2:

docker rm name_of_the_docker_container
Thavaprakash Swaminathan
fuente
44
Esto fue útil para mí, el "docker ps" necesita intuitivamente una bandera para devolver cualquier cosa.
MichaelChan
docker ps solo devuelve contenedores y necesidades en ejecución -a para enumerar incluso los detenidos.
Surendra Pratap
57

Solo para explicar lo que otros dicen (me tomó un tiempo entender) es que, simplemente, cuando ve este error, significa que ya tiene un contenedor y lo que debe hacer es ejecutarlo. Aunque intuitivamente docker runse supone que debe ejecutarlo, no lo hace. El comando docker runse usa solo para INICIAR un contenedor por primera vez. Para ejecutar un contenedor existente, lo que necesita es docker start $container-name. Demasiado para pedirles a los desarrolladores que creen comandos significativos / intuitivos.

mithunpaul
fuente
32

Tienes 2 opciones para arreglar esto ...

  1. Elimine el contenedor anterior con ese nombre, con el comando docker rm $(docker ps -aq --filter name=myContainerName)

    O

  2. Cambie el nombre del contenedor actual a un nombre diferente, es decir, cambie esta porción --name registry-v1a algo como --name myAnotherContainerName

Obtiene este error porque ese nombre del contenedor (es decir, registry-v1) fue utilizado por otro contenedor en el pasado ... a pesar de que ese contenedor puede haber salido, es decir (actualmente no está en uso).

Edwin Ikechukwu Okonkwo
fuente
30

Cuando está creando una nueva imagen, a menudo desea ejecutar un nuevo contenedor cada vez y con el mismo nombre. Encontré que la forma más fácil era iniciar el contenedor con la opción --rm :

--rm        Automatically remove the container when it exits

p.ej

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

Lamentablemente, se usa casi al azar en los ejemplos de los documentos

Martín
fuente
imagen o contenedor?
Pim Heijden
1
Los contenedores se ejecutan a partir de imágenes construidas. Aproximadamente similar a la definición de clase (imagen) y la instancia de clase (contenedor).
Martin
Primero dices contenedor, luego imagen. Eso no está claro. Además, si un contenedor para esa imagen ya se está ejecutando, seguirá ejecutándose después de su uso --rm. No se reinicia
Pim Heijden
44
Solo una nota: --rmsolo funciona si ha creado el contenedor usando la --rmbandera. Esto significa que si creó el contenedor sin la --rmbandera, tendrá que eliminarlo manualmente antes de poder aprovechar la rmbandera.
Lepe
18

Porque

Todavía existe un contenedor con el mismo nombre.

Solución

Para reutilizar el mismo nombre de contenedor, elimine el contenedor existente:

docker rm <container name>

Explicación

Los contenedores pueden existir en los siguientes estados, durante los cuales el nombre del contenedor no se puede usar para otro contenedor:

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

Puede ver los contenedores en runningestado usando:

docker ps

Para mostrar contenedores en todos los estados y averiguar si se toma un nombre de contenedor, use:

docker ps -a
Roderick Jonsson
fuente
Si se desea reutilizar el contenedor, entonces --rm no es el conmutador apropiado. Un simple "docker start {nombre del contenedor}" es suficiente.
Ken Ingram
11

Así es como resolví esto en ubuntu 18:

  1. $ sudo docker ps -a
  2. copia la ID del contenedor

Para cada contenedor hacer:

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

Puede eliminarlo con el comando sudo docker rm YOUR_CONTAINER_IDy luego ejecutar un nuevo contenedor con sudo docker run ...; o reiniciar un contenedor existente consudo docker start YOUR_CONTAINER_ID

donglei
fuente
7

He resuelto el problema siguiendo estos pasos y espero que ayude.

  1. Escriba docker ps -apara enumerar todos los contenedores en su sistema.
  2. Verifique la parte NOMBRES donde ha inicializado su contenedor acoplable.
  3. Luego escribe docker rm --force name_of_container
  4. Instale el contenedor acoplable como desee.

Tuve problemas para usar NIFI y lo eliminé y reinstalé con Docker. Buena suerte.

Nijat Mursali
fuente
4

Estoy aprendiendo docker y esto también me atrapó. Ya detuve el contenedor con ese nombre y, por lo tanto, pensé que podría ejecutar un nuevo contenedor con ese nombre.

No es el caso. El hecho de que el contenedor esté detenido no significa que no pueda iniciarse de nuevo, y mantiene los mismos parámetros con los que se creó (incluido el nombre).

cuando corrí docker ps -afue cuando vi todos los contenedores de prueba ficticios que creé mientras jugaba.

No hay problema, ya que no quiero esos más que acabo de hacer, docker rm containernameen ese momento se permitió que mi nuevo contenedor se ejecutara con el nombre anterior.

Ah, y ahora que termino de escribir esta respuesta, veo el comentario de Slawosz sobre la respuesta de Walt Howard que sugiere el uso de docker ps -a

C. Tewalt
fuente