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.

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

Ответы:


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.


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

4
Это было полезно для меня, «docker ps» неинтуитивно нужен флаг -a, чтобы вернуть что-либо.
MichaelChan

docker ps возвращает только запущенные контейнеры и нуждается в -a для перечисления даже остановленных.
Сурендра Пратап

58

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


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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.