Сообщение об ошибке Docker от демона: «Конфликт… уже используется контейнером»

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

Как я могу это исправить?

marty_c
источник

Ответы:

218

Похоже, контейнер с таким названием qgis-desktop-2-4уже существует в системе. Вы можете проверить вывод следующей команды, чтобы убедиться, что она действительно существует:

$ docker ps -a

Последний столбец в выходных данных приведенной выше команды предназначен для имен.

Если контейнер существует, удалите его, используя:

$ docker rm qgis-desktop-2-4

Или с применением силы,

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

А затем попробуйте создать новый контейнер.

Dharmit
источник
привет @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
Похоже, что изображение пытается сделать пользователя root и корневую группу, которая на самом деле уже существует. Docker использует root: root в качестве пользователя и группы по умолчанию. Но первая проблема устранена при удалении первого контейнера.
luxas
хм, странно, почему он работал нормально с самого начала, то есть через 3-4 месяца. Есть идеи, что я могу сделать, чтобы это исправить ?!
marty_c
1
Как мы можем просто перезапустить существующий контейнер вместо того, чтобы убивать старый и снова вызывать с тем же именем?
Дханеш Мане
13
@DhaneshMane docker restartили docker stop& docker startдолжны вам помочь.
Дхармит
34

Вместо команды: docker run

Вам следует использовать:

docker start **CONTAINER ID**

потому что контейнер уже существует

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

Насир Таха
источник
1
docker start не дает параметров для включения сети хоста, монтирования томов из командной строки и других параметров, которые необходимы в моем случае. Так что лично мне пришлось удалить (обрезать), а затем запустить.
ДД
1
@horsehair, когда я использую docker start <myContainerName>, он восстанавливает все открытые порты и монтирования томов. Поэтому в зависимости от того, как вы изначально запускали контейнер, эти настройки должны разрешиться при запуске докера.
djchapm
Да, это отстой, потому что я хочу, чтобы он работал в обоих направлениях ... запуск / запуск для разработчиков, которые присоединились к команде, и для разработчиков, которые запускали его раньше. это не очень идемпотентно :(. ну, я думаю, мне нужно сделать некоторую логику if в сценариях bash
Дин Хиллер,
9

Я получал эту ошибку довольно часто, поэтому теперь выполняю пакетное удаление всех неиспользуемых контейнеров сразу:

docker container prune 

добавить -fдля принудительного удаления без запроса.

Чтобы перечислить все неиспользуемые контейнеры (без удаления):

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

Смотрите здесь другие примеры, как обрезать другие объекты (сети, тома и т. Д.).

Ноам Манос
источник
8

Для людей, попадающих сюда из Google, таких как я, и которые просто хотят создавать контейнеры, используя несколько файлов docker-compose с одной общей службой:

Иногда у вас есть разные проекты, которые могут совместно использоваться, например, контейнер докеров базы данных. Только первый запуск должен запустить DB-Docker, второй должен определить, что БД уже запущен, и пропустить это. Чтобы добиться такого поведения, нам нужно, чтобы докеры находились в одной сети и в одном проекте . Также имя контейнера докеров должно быть таким же.

1-й: установите одно и то же имя сети и контейнера в 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 параметра или поместите оба файла в один каталог.

docker-compose -p {projectname} up

Карл Адлер
источник