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?

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.


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


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.