Odpowiedź na błąd Dockera od demona: „Konflikt… już używany przez kontener”

135

Używałem Dockera na moim komputerze do uruchomienia Quantum GIS z następującymi instrukcjami, które znalazłem tutaj: docker-qgis-desktop - Prosty kontener docker, który działa na pulpicie QGIS

Wszystko działało dobrze do zeszłego tygodnia, kiedy zacząłem otrzymywać ten komunikat o błędzie:

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.

Nie jestem do końca pewien, co to oznacza, pomimo wyszukiwania wskazówek na tej stronie. Nie zmieniłem niczego przed tym wydarzeniem i pomyślnie uruchomiłem kontener za pomocą tego polecenia:

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

Jak mogę to naprawić?

marty_c
źródło

Odpowiedzi:

217

Wygląda na to, że kontener o nazwie qgis-desktop-2-4już istnieje w systemie. Możesz sprawdzić dane wyjściowe poniższego polecenia, aby potwierdzić, czy rzeczywiście istnieje:

$ docker ps -a

Ostatnia kolumna w wynikach powyższego polecenia dotyczy nazw.

Jeśli pojemnik istnieje, usuń go za pomocą:

$ docker rm qgis-desktop-2-4

Lub używając siły,

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

A następnie spróbuj utworzyć nowy kontener.

Dharmit
źródło
hej @Dharmit dzięki za komentarz. Próbowałem, ale teraz otrzymuję następujący komunikat o błędziegroupadd: 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
Wygląda na to, że obraz próbuje uczynić użytkownika root i grupę root, które w rzeczywistości już istnieją. Docker używa root: root jako domyślnego użytkownika i grupy. Ale pierwszy problem został rozwiązany po usunięciu pierwszego pojemnika.
luxas
hmm, dziwne, więc dlaczego na początku działało dobrze, tj. 3-4 miesiące. Jakieś pomysły, co mogę zrobić, aby to naprawić ?!
marty_c
1
Jak możemy po prostu zrestartować istniejący kontener zamiast zabijać stary i ponownie wywoływać o tej samej nazwie?
Dhanesh Mane
13
@DhaneshMane docker restartlub docker stop& docker startpowinien ci pomóc.
Dharmit
34

Zamiast polecenia: docker run

Powinieneś użyć:

docker start **CONTAINER ID**

ponieważ kontener już istnieje

Więcej informacji

nasir taha
źródło
1
„docker start” nie daje opcji włączania sieci hosta, montowania woluminów z wiersza poleceń i innych opcji, które są niezbędne w moim przypadku. Więc osobiście musiałem usunąć (przyciąć), a następnie uruchomić.
HH- Przeproś Carole Baskin
1
@horsehair, gdy używam docker start <myContainerName>, ponownie ustanawia wszystkie udostępnione porty i montowania woluminów. Więc w zależności od tego, jak początkowo uruchomiłeś kontener, te ustawienia powinny zostać rozwiązane po uruchomieniu dockera.
djchapm
Tak, ten rodzaj jest do bani, ponieważ chcę, aby działał w obie strony ... start / bieg dla programistów, którzy dołączają do zespołu, i dla programistów, którzy wcześniej go prowadzili. to nie jest zbyt idempotentne :(. no cóż, myślę, że muszę zrobić trochę logiki w skryptach basha
Dean Hiller
9

Mam ten błąd całkiem sporo, więc teraz robię zbiorcze usuwanie wszystkich nieużywanych pojemników naraz:

docker container prune 

dodaj -fdo usuwania siły bez pytania.

Aby wyświetlić wszystkie nieużywane pojemniki (bez usuwania):

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

Zobacz tutaj więcej przykładów przycinania innych obiektów (sieci, wolumenów itp.).

Noam Manos
źródło
8

Dla osób, które lądują tutaj z Google, takich jak ja i chcą po prostu budować kontenery przy użyciu wielu plików docker-compose z jedną wspólną usługą:

Czasami masz różne projekty, które współużytkują np. Kontener bazodanowy. Tylko pierwsze uruchomienie powinno uruchomić DB-Docker, drugie powinno wykryć, że DB już działa i pominąć to. Aby osiągnąć takie zachowanie, Dockery muszą znajdować się w tej samej sieci i w tym samym projekcie . Również nazwa kontenera Dockera musi być taka sama.

1st: Ustaw tę samą nazwę sieci i kontenera w docker-compose

docker-compose w projekcie 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 w projekcie 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:

2nd: Ustaw ten sam projekt za pomocą -p param lub umieść oba pliki w tym samym katalogu.

docker-compose -p {projectname} up

Karl Adler
źródło