Respuesta de error de Docker del daemon: "Conflicto ... ya está en uso por contenedor"

135

He estado usando Docker en mi PC para ejecutar Quantum GIS con las siguientes instrucciones que he encontrado aquí: docker-qgis-desktop: un contenedor de Docker simple que ejecuta el escritorio QGIS

Todo ha estado funcionando bien hasta la semana pasada cuando comencé a recibir este mensaje de error:

Error response from daemon: Conflict. 
The name "qgis-desktop-2-4" is already in use by container 235566ae17b8. 
You have to delete (or rename) that container to be able to reuse that name.

No estoy completamente seguro de lo que esto significa a pesar de buscar pistas en este sitio. No había cambiado nada antes de que esto sucediera y he estado iniciando con éxito el contenedor con este comando:

sudo docker run --rm --name="qgis-desktop-2-4"     -i -t     -v ${HOME}:/home/${USER}     -v /tmp/.X11-unix:/tmp/.X11-unix     -e DISPLAY=unix$DISPLAY     kartoza/qgis-desktop:latest

¿Cómo puedo arreglar esto?

marty_c
fuente

Respuestas:

217

Parece que qgis-desktop-2-4ya existe un contenedor con el nombre en el sistema. Puede verificar el resultado del siguiente comando para confirmar si realmente existe:

$ docker ps -a

La última columna en la salida del comando anterior es para nombres.

Si el contenedor existe, retírelo usando:

$ docker rm qgis-desktop-2-4

O usando con fuerza,

$ docker rm -f qgis-desktop-2-4

Y luego intente crear un nuevo contenedor.

Dharmit
fuente
Hola @Dharmit gracias por el comentario. Lo intenté pero ahora recibo el siguiente mensaje de errorgroupadd: GID '0' already exists useradd: user 'root' already exists No protocol specified Warning: qgis.bin: cannot connect to X server unix:0.0
marty_c
Parece que la imagen intenta hacer que el usuario sea root, y un grupo raíz que de hecho ya existe. Docker usa root: root como usuario y grupo predeterminados. Pero el primer problema se soluciona cuando elimina el primer contenedor.
luxas
hmm, raro, entonces ¿por qué estaba funcionando bien para empezar, es decir, 3 a 4 meses? ¿Alguna idea de lo que puedo hacer para arreglar esto?
marty_c
1
¿Cómo podemos simplemente reiniciar el contenedor existente en lugar de matar el viejo e invocar con el mismo nombre nuevamente?
Dhanesh Mane
13
@DhaneshMane docker restart, o docker stopy docker startdebe ayudarle.
Dharmit
34

En lugar de comando: docker run

Deberías usar:

docker start **CONTAINER ID**

porque el contenedor ya existe

Más información

nasir taha
fuente
1
'docker start' no ofrece opciones para habilitar la red de host, montar volúmenes desde la línea de comandos y otras opciones que son necesarias en mi caso. Así que personalmente tuve que eliminar (podar) y luego ejecutar.
HH- Pide disculpas a Carole Baskin
1
@horsehair cuando uso docker start <myContainerName> restablece todos los puertos expuestos y montajes de volumen. Entonces, dependiendo de cómo ejecutó inicialmente su contenedor, esas configuraciones deberían resolverse con el inicio de Docker.
djchapm
Sí, esto apesta, ya que quiero que funcione en ambos sentidos ... iniciar / ejecutar para desarrolladores que se unen al equipo y para desarrolladores que lo ejecutaron una vez antes. no es muy idempotente :(. bueno, supongo que tengo que hacer algo si la lógica en los guiones de bash
Dean Hiller
9

Recibí este error bastante, así que ahora hago una eliminación por lotes de todos los contenedores no utilizados a la vez:

docker container prune 

agregar -fpara forzar la eliminación sin aviso.

Para enumerar todos los contenedores no utilizados (sin eliminación):

docker container ls -a --filter status=exited --filter status=created 

Vea aquí más ejemplos de cómo podar otros objetos (redes, volúmenes, etc.).

Noam Manos
fuente
8

Para las personas que llegan aquí desde Google como yo y solo quieren construir contenedores utilizando múltiples archivos de composición acoplable con un servicio compartido:

A veces tiene diferentes proyectos que compartirían, por ejemplo, un contenedor de base de datos. Solo la primera ejecución debe iniciar DB-Docker, la segunda debe detectar que la base de datos ya se está ejecutando y omitir esto. Para lograr ese comportamiento, necesitamos que los Dockers se instalen en la misma red y en el mismo proyecto . También el nombre del contenedor docker debe ser el mismo.

Primero: establezca el mismo nombre de red y contenedor en docker-compose

docker-compose en el proyecto 1:

version: '3'

services:
    service1:
        depends_on:
            - postgres
        # ...
        networks:
            - dockernet

    postgres:
        container_name: project_postgres
        image: postgres:10-alpine
        restart: always
        # ...
        networks:
            - dockernet

networks:
    dockernet:

docker-compose en el proyecto 2:

version: '3'

services:
    service2:
        depends_on:
            - postgres
        # ...
        networks:
            - dockernet

    postgres:
        container_name: project_postgres
        image: postgres:10-alpine
        restart: always
        # ...
        networks:
            - dockernet

networks:
    dockernet:

2º: Configure el mismo proyecto usando -p param o coloque ambos archivos en el mismo directorio.

docker-compose -p {projectname} up

Karl Adler
fuente