Docker run -> 'имя уже используется контейнером'

387

Запуск dockerреестра с помощью команды ниже всегда выдает ошибку:

dev:tmp me$ docker run \
     -d --name registry-v1 \
     -e SETTINGS_FLAVOR=local \
     -e STORAGE_PATH=/registry \
     -e SEARCH_BACKEND=sqlalchemy \
     -e LOGLEVEL=DEBUG \
     -p 5000:5000 \
     registry:0.9.1
Error response from daemon: Conflict. The name "registry-v1" is already in use by container f9e5798a82e0. You have to delete (or rename) that container to be able to reuse that name.

Как предотвратить эту ошибку?

Rubytastic
источник

Ответы:

428

Я тоже запутался в этом. Здесь есть две соответствующие команды:

docker run Запустить команду в новом контейнере

Docker start Запуск одного или нескольких остановленных контейнеров

Уолт Ховард
источник
8
Это ответ, который я искал для повторного запуска контейнера Docker. Спасибо!
Исапир
105
Поэтому также важно использовать, docker ps -aчтобы увидеть все контейнеры в этом случае.
Славош
9
да, docker start -a container-nameэто команда, которую вы можете использовать для запуска контейнера, который был создан docker run. Обратите внимание на -aфлаг, который является сокращением для --attach. Таким образом, контейнер запускается на переднем плане, точно так же, как при использовании docker run(по умолчанию контейнер запускается на переднем плане).
Кшиштоф Воловски
1
@Suncatcher Да.
0x7d7b
1
@ eMPee584 Нет, потому что docker create создает контейнер, но не запускает его.
0x7d7b
182

Это означает, что вы уже запустили контейнер в прошлом с параметром docker run --name registry-v1 ....

Вам нужно сначала удалить это, прежде чем вы сможете заново создать контейнер с тем же именем с помощью docker rm registry-v1. Когда этот контейнер работает, вам нужно сначала остановить его, прежде чем вы сможете удалить его с помощью docker stop registry-v1. Или просто выберите другое имя для нового контейнера.

Чтобы получить список существующих контейнеров и их имена, просто вызовите docker ps -a.

0x7d7b
источник
4
Но почему они остановлены? Или что хорошего, если они все еще там, если их остановили?
Mskw
2
Таким образом, вы можете запустить их позже, не воссоздавая их
Скотт Стенсланд
2
Таким образом, вы в основном говорите: «чтобы вы могли запустить изображение один раз (т.е. создать контейнер, а затем выполнить команду в нем), а затем запустить контейнер столько раз, сколько пожелаете». Но зачем нам запускать что-то только один раз? Даже не сохраняя возможные изменения, которые «что-то» внесло в контейнер (помните, изменения состояния контейнера Docker будут потеряны, если они не зафиксированы).
Максим Гумеров
14
Если вы знаете имя своего контейнера, вы можете удалить его с помощью этого ярлыкаdocker rm $(docker ps -aq --filter name=myContainerName)
Джуджар Сингх
2
@JujharSingh Почему не только docker rm myContainerName?
Родриго
153

Вот что я сделал, все отлично работает.

Шаг 1: (он перечисляет Docker-контейнер со своим именем)

docker ps -a

шаг 2:

docker rm name_of_the_docker_container
Thavaprakash Swaminathan
источник
4
Это было полезно для меня, «docker ps» неинтуитивно нужен флаг -a, чтобы вернуть что-либо.
MichaelChan
docker ps возвращает только запущенные контейнеры и нуждается в -a для перечисления даже остановленных.
Сурендра Пратап
58

Просто чтобы объяснить, что говорят другие (мне потребовалось некоторое время, чтобы понять), проще говоря, когда вы видите эту ошибку, это означает, что у вас уже есть контейнер, и вам нужно запустить его. Хотя интуитивно docker runпредполагается запустить его, это не так. Команда docker runиспользуется только для запуска контейнера в первый раз. Для запуска существующего контейнера вам нужно docker start $container-name. Так много для того, чтобы попросить разработчиков создавать значимые / интуитивно понятные команды.

mithunpaul
источник
32

У вас есть 2 варианта исправить это ...

  1. Удалить предыдущий контейнер, используя это имя, с помощью команды docker rm $(docker ps -aq --filter name=myContainerName)

    ИЛИ

  2. Переименуйте текущий контейнер в другое имя, т.е. измените эту часть --name registry-v1на что-то вроде --name myAnotherContainerName

Вы получаете эту ошибку, потому что это имя контейнера (то есть registry-v1) использовалось другим контейнером в прошлом ... даже если этот контейнер мог завершиться, т. Е. (В настоящее время не используется).

Эдвин Икечукву Оконкво
источник
30

Когда вы создаете новый образ, вам часто хочется каждый раз запускать новый контейнер с тем же именем. Я обнаружил, что проще всего запустить контейнер с параметром --rm :

--rm        Automatically remove the container when it exits

например

docker run --name my-micro-service --rm <image>

К сожалению, он используется почти случайно в примерах из документов

Мартин
источник
изображение или контейнер?
Пим Хейден
1
Контейнеры запускаются из встроенных изображений. Примерно похоже на определение класса (изображение) и экземпляр класса (контейнер).
Мартин
Сначала вы говорите контейнер, затем изображение. Это неясно. Более того, если контейнер для этого образа уже запущен, он останется запущенным после использования --rm. Это не перезапускается.
Пим Хейден
4
Просто примечание: --rmработает, только если вы создали контейнер, используя --rmфлаг. Это означает, что если вы создали контейнер без --rmфлага, вам придется удалить его вручную, чтобы использовать rmфлаг.
Лепе
18

причина

Контейнер с тем же именем все еще существует.

Решение

Чтобы повторно использовать то же имя контейнера, удалите существующий контейнер:

docker rm <container name>

объяснение

Контейнеры могут существовать в следующих состояниях, во время которых имя контейнера нельзя использовать для другого контейнера:

  • created
  • restarting
  • running
  • paused
  • exited
  • dead

Вы можете увидеть контейнеры в runningсостоянии с помощью:

docker ps

Чтобы показать контейнеры во всех состояниях и узнать, занято ли имя контейнера, используйте:

docker ps -a
Родерик Йонссон
источник
Если вы хотите повторно использовать контейнер, то --rm не является подходящим ключом. Достаточно простого «запуска докера {имя контейнера}».
Кен Ингрэм
11

Вот как я решил это на Ubuntu 18:

  1. $ sudo docker ps -a
  2. скопировать контейнер ID

Для каждого контейнера сделайте:

  1. $ sudo docker stop container_ID
  2. $ sudo docker rm container_ID
Али Фагихиния
источник
10

Вы можете удалить его с помощью команды sudo docker rm YOUR_CONTAINER_ID, а затем запустить новый контейнер с помощью sudo docker run ...; или перезапустите существующий контейнер сsudo docker start YOUR_CONTAINER_ID

donglei
источник
7

Я решил проблему, выполнив следующие шаги, и я надеюсь, что это поможет.

  1. Введите docker ps -aсписок всех контейнеров в вашей системе.
  2. Проверьте часть NAMES, в которой вы инициализировали свой док-контейнер.
  3. Затем введите docker rm --force name_of_container
  4. Установите док-контейнер, как вы хотите.

У меня были проблемы с использованием NIFI, и я удалил и переустановил с помощью Docker. Удачи.

Ниджат Мурсали
источник
4

Я только учусь докеру, и это меня тоже достало. Я уже остановил контейнер с таким именем и поэтому подумал, что могу запустить новый контейнер с этим именем.

Не тот случай. Тот факт, что контейнер остановлен, не означает, что он не может быть запущен снова, и он сохраняет все те же параметры, с которыми он был создан (включая имя).

когда я бегал docker ps -a, тогда я видел все фиктивные тестовые контейнеры, которые я создал, пока играл.

Нет проблем, так как я больше не хочу тех, которые я только что сделал, и docker rm containernameв этот момент моему новому контейнеру разрешили работать со старым именем.

Ах, и теперь, когда я заканчиваю писать этот ответ, я вижу комментарий Славоша к ответу Уолта Ховарда выше, предлагающий использовать docker ps -a

C. Tewalt
источник