Відповідь на помилку Докера від демон: "Конфлікт ... вже використовується контейнер"


135

Я використовую Docker на своєму ПК для запуску Quantum GIS із наступними інструкціями, які я знайшов тут: docker-qgis-desktop - простий контейнер докера, який працює на робочому столі QGIS

Все працює нормально до минулого тижня, коли я почав отримувати це повідомлення про помилку:

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.

Я не зовсім впевнений, що це означає, незважаючи на пошук підказки на цьому сайті. Я нічого не змінив до цього, і успішно запустив контейнер з цією командою:

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

Як я можу це виправити?

Відповіді:


217

Схоже, контейнер з назвою qgis-desktop-2-4вже існує в системі. Ви можете перевірити вихід команди нижче, щоб підтвердити, чи дійсно вона існує:

$ docker ps -a

Останній стовпець у виведенні вищезгаданої команди призначений для імен.

Якщо контейнер існує, вийміть його, використовуючи:

$ docker rm qgis-desktop-2-4

Або насильно використовуючи,

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

А потім спробуйте створити новий контейнер.


Ей @Dharmit дякую за коментар. Я спробував це, але тепер отримайте таке повідомлення про помилкуgroupadd: 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

Схоже, що зображення намагається зробити корінь користувача, а також кореневу групу, яка обох насправді вже існує. Docker використовує root: root як користувач та групу за замовчуванням. Але перша проблема виправлена, коли ви вийняли перший контейнер.
люкс

Хм, дивно, тому чому добре працювали, починаючи з 3–4 місяців. Будь-які ідеї, що я можу зробити, щоб виправити це ?!
marty_c

1
Як ми можемо просто перезапустити існуючий контейнер, а не вбивати старий та знову викликати те саме ім’я?
Dhanesh Mane

13
@DhaneshMane docker restart, або docker stop& docker startповинен допомогти вам.
Дхарміт

34

Замість команди: docker run

Ви повинні використовувати:

docker start **CONTAINER ID**

тому що контейнер вже існує

Більше інформації


1
'docker start' не дає опцій, щоб увімкнути мережу хостів, змонтувати томи з командного рядка та інші параметри, необхідні в моєму випадку. Тож особисто мені довелося видалити (підрізати), а потім запустити.
НН- Вибачте перед Каролею Баскін

1
@horsehair, коли я використовую docker start <myContainerName>, він відновлює всі відкриті порти та кріплення гучності. Отже, залежно від того, як ви спочатку запустили контейнер, ці налаштування повинні вирішитись із запуском докера.
djchapm

Так, такий вид смокче, як я хочу, щоб він працював обома способами .... запустити / запустити для розробників, які приєднуються до команди, і для розробників, які виконували її один раз раніше. це не дуже ідентично :(. о, добре, я думаю, я повинен зробити деякі, якщо логіка в сценаріях bash
Дін Хіллер,

9

У мене цієї помилки досить багато, тому зараз я роблю пакетне видалення всіх невикористаних контейнерів одразу:

docker container prune 

додати -fдо зняття сили без підказки.

Щоб перерахувати всі невикористані контейнери (без вилучення):

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

Дивіться тут більше прикладів, як обрізати інші об’єкти (мережі, томи тощо).


8

Люди, які прибувають сюди з google, як я, і просто хочуть створити контейнери, використовуючи кілька файлів, що складають докер, з однією спільною службою:

Іноді у вас є різні проекти, якими можна поділитися, наприклад, контейнер для докерів бази даних. Тільки перший запуск повинен запустити DB-Docker, другий повинен виявити, що БД вже запущений, і пропустити це. Для досягнення такої поведінки нам потрібні докери, щоб вони лежали в одній мережі та в одному проекті . Також ім'я контейнера докер має бути однаковим.

Перше: Встановіть ту саму назву мережі та контейнера в docker-compose

docker-compose у проекті 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 у проекті 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-е: встановіть один і той же проект за допомогою -p param або покладіть обидва файли в одну директорію.

docker-compose -p {projectname} up

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.