Réponse d'erreur Docker du démon: "Conflit… déjà utilisé par le conteneur"

135

J'utilise Docker sur mon PC pour exécuter Quantum GIS avec les instructions suivantes que j'ai trouvées ici: docker-qgis-desktop - Un simple conteneur de docker qui exécute QGIS Desktop

Tout fonctionnait bien jusqu'à la semaine dernière, lorsque j'ai commencé à recevoir ce message d'erreur:

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.

Je ne suis pas tout à fait sûr de ce que cela signifie malgré la recherche d'indices sur ce site. Je n'avais rien changé avant que cela ne se produise et j'ai réussi à lancer le conteneur avec cette commande:

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

Comment puis-je réparer cela?

marty_c
la source

Réponses:

217

Il semble qu'un conteneur avec le nom qgis-desktop-2-4existe déjà dans le système. Vous pouvez vérifier la sortie de la commande ci-dessous pour confirmer si elle existe bien:

$ docker ps -a

La dernière colonne de la sortie de la commande ci-dessus concerne les noms.

Si le conteneur existe, supprimez-le en utilisant:

$ docker rm qgis-desktop-2-4

Ou en utilisant avec force,

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

Et puis essayez de créer un nouveau conteneur.

Dharmit
la source
hé @Dharmit merci pour le commentaire. J'ai essayé cela mais maintenant je reçois le message d'erreur suivantgroupadd: 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
Il semble que l'image tente de rendre l'utilisateur root et un groupe racine qui existent déjà tous les deux. Docker utilise root: root comme utilisateur et groupe par défaut. Mais le premier problème est résolu lorsque vous supprimez le premier conteneur.
luxas
hmm, bizarre alors pourquoi cela fonctionnait-il bien pour commencer, c'est-à-dire 3 à 4 mois. Des idées sur ce que je peux faire pour résoudre ce problème?!
marty_c
1
Comment pouvons-nous simplement redémarrer le conteneur existant au lieu de tuer l'ancien et de l'invoquer à nouveau avec le même nom?
Dhanesh Mane
13
@DhaneshMane docker restart, ou docker stop& docker startdevrait vous aider.
Dharmit
34

Au lieu de la commande: docker run

Tu devrais utiliser:

docker start **CONTAINER ID**

parce que le conteneur existe déjà

Plus d'informations

nasir taha
la source
1
'docker start' ne donne pas d'options pour activer la mise en réseau de l'hôte, monter les volumes à partir de la ligne de commande et d'autres options nécessaires dans mon cas. Donc, personnellement, j'ai dû supprimer (élaguer) puis courir.
HH- Présentez vos excuses à Carole Baskin le
1
@horsehair lorsque j'utilise docker start <myContainerName>, il rétablit tous les ports exposés et les montages de volume. Donc, selon la façon dont vous avez initialement exécuté votre conteneur, ces paramètres doivent être résolus avec le démarrage du docker.
djchapm
Ouais, ce genre de problème car je veux que cela fonctionne dans les deux sens .... démarrer / exécuter pour les développeurs qui rejoignent l'équipe et pour les développeurs qui l'ont exécuté une fois auparavant. ce n'est pas très idempotent :(. eh bien, je suppose que je dois faire un peu de logique dans les scripts bash
Dean Hiller le
9

J'ai beaucoup d'erreur, alors maintenant je supprime par lots tous les conteneurs inutilisés à la fois:

docker container prune 

ajouter -fpour forcer la suppression sans invite.

Pour répertorier tous les conteneurs inutilisés (sans suppression):

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

Voir ici plus d'exemples comment élaguer d'autres objets (réseaux, volumes, etc.).

Noam Manos
la source
8

Pour les personnes qui arrivent ici depuis Google comme moi et qui souhaitent simplement créer des conteneurs à l'aide de plusieurs fichiers docker-compose avec un service partagé:

Parfois, vous avez différents projets qui partageraient par exemple un conteneur de docker de base de données. Seule la première exécution doit démarrer le DB-Docker, la seconde doit détecter que la base de données est déjà en cours d'exécution et l'ignorer. Pour parvenir à un tel comportement, nous avons besoin que les Dockers se trouvent dans le même réseau et dans le même projet . Le nom du conteneur Docker doit également être le même.

1er: définir le même nom de réseau et de conteneur dans docker-compose

docker-compose dans le projet 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 dans le projet 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ème: Définissez le même projet en utilisant -p param ou placez les deux fichiers dans le même répertoire.

docker-compose -p {projectname} up

Karl Adler
la source