Risposta di errore Docker dal demone: "Conflitto ... già in uso dal contenitore"


135

Sto usando Docker sul mio PC per eseguire Quantum GIS con le seguenti istruzioni che ho trovato qui: docker-qgis-desktop - Un semplice contenitore docker che esegue QGIS desktop

Tutto è andato bene fino alla settimana scorsa quando ho iniziato a ricevere questo messaggio di errore:

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.

Non sono del tutto sicuro di cosa significhi nonostante la ricerca di indizi su questo sito. Non avevo cambiato nulla prima che ciò accadesse e ho avviato con successo il contenitore con questo 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

Come posso risolvere questo problema?

Risposte:


217

Sembra che un contenitore con il nome qgis-desktop-2-4esista già nel sistema. È possibile controllare l'output del comando seguente per confermare se esiste effettivamente:

$ docker ps -a

L'ultima colonna nell'output del comando sopra è per i nomi.

Se il contenitore esiste, rimuoverlo usando:

$ docker rm qgis-desktop-2-4

O usando con forza,

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

E quindi prova a creare un nuovo contenitore.


hey @Dharmit grazie per il commento. Ci ho provato ma ora ricevo il seguente messaggio di erroregroupadd: 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,

Sembra che l'immagine cerchi di rendere l'utente root e un gruppo root che entrambi già esistono. Docker utilizza root: root come utente e gruppo predefiniti. Ma il primo problema è stato risolto quando hai rimosso il primo contenitore.
lux,

hmm, strano quindi perché ha funzionato bene, per esempio con 3-4 mesi. Qualche idea su cosa posso fare per risolvere questo problema ?!
marty_c,

1
Come possiamo semplicemente riavviare il contenitore esistente invece di uccidere quello vecchio e invocare di nuovo con lo stesso nome?
Dhanesh Mane,

13
@DhaneshMane docker restart, o docker stope docker startdovrebbe aiutare.
Dharmit,

34

Invece del comando: docker run

Dovresti usare:

docker start **CONTAINER ID**

perché il contenitore esiste già

Ulteriori informazioni


1
'docker start' non offre opzioni per abilitare la rete host, montare volumi dalla riga di comando e altre opzioni necessarie nel mio caso. Quindi personalmente ho dovuto cancellare (potare) e poi correre.
HH- Scusati con Carole Baskin l'

1
@horsehair quando uso docker start <mioContainerName> ristabilisce tutte le porte esposte e i montaggi del volume. Quindi, a seconda della modalità di esecuzione iniziale del contenitore, tali impostazioni dovrebbero risolversi con l'avvio della finestra mobile.
djchapm

Sì, questo tipo di schifo perché voglio che funzioni in entrambi i modi .... avvio / esecuzione per gli sviluppatori che si uniscono al team e per gli sviluppatori che lo hanno eseguito una volta prima. non è molto idempotente :(. vabbè, credo di dover fare un po 'di logica negli script bash
Dean Hiller

9

Ho riscontrato questo errore abbastanza, quindi ora eseguo una rimozione batch di tutti i contenitori inutilizzati contemporaneamente:

docker container prune 

aggiungere -fper forzare la rimozione senza prompt.

Per elencare tutti i contenitori non utilizzati (senza rimozione):

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

Vedi qui altri esempi su come potare altri oggetti (reti, volumi, ecc.).


8

Per le persone che arrivano qui da Google come me e vogliono solo creare container utilizzando più file comporre docker con un servizio condiviso:

A volte hai progetti diversi che condividono ad esempio un contenitore finestra mobile del database. Solo la prima esecuzione dovrebbe avviare DB-Docker, la seconda dovrebbe rilevare che il DB è già in esecuzione e saltare questo. Per raggiungere un simile comportamento, abbiamo bisogno che i Docker si trovino nella stessa rete e nello stesso progetto . Anche il nome del contenitore docker deve essere lo stesso.

1 °: imposta lo stesso nome di rete e contenitore in docker-compose

docker-compose nel progetto 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 nel progetto 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 °: imposta lo stesso progetto usando -p param o inserisci entrambi i file nella stessa directory.

docker-compose -p {projectname} up

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.