ChatGPT解决这个技术问题 Extra ChatGPT

Docker - 名称已被容器使用

使用以下命令运行 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.

我怎样才能防止这个错误?


v
vinzee

我也被这个弄糊涂了。这里有两个相关的命令:

docker run  # Run a command in a **new** container
docker start  # Start one or more stopped containers

因此,在这种情况下使用 docker ps -a 查看所有容器也很重要。
是的,docker start -a container-name 是您可以用来启动使用 docker run 创建的容器的命令。请注意 -a 标志,它是 --attach 的简写。这样容器在前台启动,就像使用 docker run 时一样(默认情况下在前台运行容器)。
start 命令是否使用相同的设置(端口、依赖项等)重新运行容器?
@Suncatcher 是的。
i
iliketocode

这意味着您过去已经使用参数启动了一个容器

docker run --name registry-v1 ...

您需要先删除它,然后才能重新创建具有相同名称的容器

docker rm registry-v1

当该容器正在运行时,您需要先停止它,然后才能删除它

docker stop registry-v1

或者干脆为新容器选择一个不同的名称。

要获取现有容器及其名称的列表,只需调用

docker ps -a

但是为什么那些被停下来的呢?或者如果他们停止了,他们仍然在那里有什么好处?
因此,您可以稍后运行它们而无需重新创建它们
因此,您基本上是在说“这样您就可以运行一次映像(即生成容器然后在其中运行命令),然后根据需要多次启动容器”。但是为什么我们只需要运行一次呢?甚至没有持久化“某事”对容器所做的可能更改(请记住,除非提交,否则 docker 容器状态更改将丢失)。
如果您知道容器的名称,则可以使用此快捷方式 docker rm $(docker ps -aq --filter name=myContainerName) 将其删除
@JujharSingh 为什么不只是docker rm myContainerName
T
Thavaprakash Swaminathan

这是我所做的,它工作正常。

第 1 步:(它列出了 docker 容器及其名称)

docker ps -a

第2步:

docker rm name_of_the_docker_container

这对我很有帮助,“docker ps”不直观地需要 -a 标志来返回任何东西。
docker ps 仅返回正在运行的容器,并且需要 -a 来列出已停止的容器。
m
mithunpaul

只是为了解释其他人在说什么(我花了一些时间才理解),简单地说,当你看到这个错误时,这意味着你已经有了一个容器,你要做的就是运行它。虽然直观地 docker run 应该运行它,但它没有。命令 docker run 仅用于第一次START容器。要运行现有容器,您需要 docker start $container-name。要求开发人员创建有意义/直观的命令非常重要。


docker run = 创建 docker 容器 + 启动 docker 容器
M
Martin

当你构建一个新镜像时,你通常希望每次都运行一个同名的新容器。我发现最简单的方法是使用 --rm 选项启动容器:

--rm        Automatically remove the container when it exits

例如

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

遗憾的是,它在 docs 的示例中几乎是随机使用的

编辑:阅读下面 Lepe 的评论。


图像或容器?
容器从构建的镜像运行。大致类似于类定义(图像)和类实例(容器)。
首先你说容器,然后是图像。这还不清楚。此外,如果该映像的容器已在运行,则在使用 --rm 后它将继续运行。它不会重新启动。
请注意:--rm 仅在您使用 --rm 标志创建容器时才有效。这意味着,如果您创建的容器没有 --rm 标志,则必须手动将其删除,然后才能利用 rm 标志。
E
Edwin O.

您有 2 个选项来解决此问题...

使用该名称删除以前的容器,使用命令 docker rm $(docker ps -aq --filter name=myContainerName) 或将当前容器重命名为不同的名称,即将这部分 --name registry-v1 更改为 --name myAnotherContainerName

您收到此错误是因为该容器名称(即 registry-v1)过去曾被另一个容器使用...即使该容器可能已退出,即(当前未使用)。


R
Roderick Jonsson

原因

同名的容器仍然存在。

解决方案

要重复使用相同的容器名称,请通过以下方式删除现有容器:

docker rm <container name>

解释

容器可以存在以下状态,在此期间容器名称不能用于另一个容器:

创建

重启

跑步

暂停

退出

死的

您可以使用以下命令查看处于 running 状态的容器:

docker ps

要显示所有状态的容器并确定是否使用了容器名称,请使用:

docker ps -a

如果希望重新使用容器,那么 --rm 不是合适的开关。一个简单的“docker start {container name}”就足够了。
c
colidyre

这是我在 ubuntu 18 上解决这个问题的方法:

$ sudo docker ps -a 复制容器 ID

对于每个容器,请执行以下操作:

$ sudo docker stop container_ID $ sudo docker rm container_ID


a
avivamg

问题:您尝试在后台运行同名容器时创建新容器,这种情况会导致冲突。

错误将是:

无法为服务 X 创建 continer:冲突。名称 X 已被容器 abc123xyz 使用。您必须删除或删除(或重命名)该容器才能重用该名称。

解决方案重命名docker-compose.yml中的服务名称或删除正在运行的容器并重新构建(此解决方案与Unix/Linux/macOS系统有关):

获取所有正在运行的容器 sudo docker ps -a 获取特定的容器 ID 停止并删除重复的容器/强制删除它

sudo docker stop <container_id>
sudo docker rm <container_id>

或者

sudo docker rm --force <container_id>

E
Edwin O.

您可以使用命令 sudo docker rm YOUR_CONTAINER_ID 将其删除,然后使用 sudo docker run ... 运行一个新容器;或使用 sudo docker start YOUR_CONTAINER_ID 重新启动现有容器


m
max

删除所有退出的容器

docker rm $(docker ps -a -f status=exited -q)

N
Nijat Mursali

我已经通过执行以下步骤解决了这个问题,希望对您有所帮助。

键入 docker ps -a 以列出系统中的所有容器。检查初始化 docker 容器的 NAMES 部分。然后输入 docker rm --force name_of_container 根据需要安装 docker 容器。

我在使用 NIFI 时遇到问题,我已使用 docker 删除并重新安装。祝你好运。


P
Potherca

我遇到了这个问题,当我运行 docker rm (通常有效)时,我会得到:

错误:没有这样的图像

最简单的解决方案是通过运行删除所有停止的容器:

docker container prune

C
C. Tewalt

我只是在学习 docker,这也让我受益匪浅。我已经停止了具有该名称的容器,因此我认为我可以运行具有该名称的新容器。

不是这样。仅仅因为容器已停止,并不意味着它不能再次启动,并且它保留了创建它时使用的所有相同参数(包括名称)。

当我运行 docker ps -a 时,我看到了我在玩耍时创建的所有虚拟测试容器。

没问题,因为我不再想要这些了,所以我刚刚做了 docker rm containername,此时允许我的新容器使用旧名称运行。

啊,现在我写完这个答案,我看到 Slawosz 对 Walt Howard 的上述回答的评论建议使用 docker ps -a


O
Olaoye Oluwapelumi

TL:博士;

列出所有容器:
docker ps -a
按 id 删除相关容器:
docker container rm <container_id>


M
Michael Cole

OP的问题是错误。删除状态不是唯一的解决方案——甚至不是一个好的解决方案。问题是 docker run 是不可重入的,而 docker start 在没有 run 的情况下是无能为力的。所以我们必须把它们结合起来。

例如要运行 Postgres 而不破坏以前的状态,试试这个:

docker start postgres || docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=password postgres:13-alpine

T
T Olaleye

我遇到了这个问题,因为我在 docker-compose.yml 文件中有两个或多个具有相同 container_name 的容器。


C
Coffee and Code

好的,所以我也不明白,然后我离开了我的电脑,去做其他事情,然后在我回来时,它点击了:D

你下载一个 docker 镜像文件。 docker pull *image-name* 只会从 docker hub 拉取图像而不运行它。现在,您使用 docker run,并为其命名(例如 newWebServer)。 docker run -d -p 8080:8080 -v volume --name newWebServer image-name/version

您可能只需要 docker run --name *name* *image*,但其他东西很快就会变得有用。

-d(分离)- 表示容器将在用于运行容器的根进程退出时退出。

-p(端口)- 指定容器端口和主机端口。内部和外部端口的种类。内部端口是容器使用的端口,外部端口是您在其外部使用的端口,如果这是您访问应用程序的方式,则可能需要放入 Web 浏览器中。

--name(您要调用此容器实例)- 您可以拥有同一个容器的多个实例,它们都具有不同的名称,这在您尝试测试某些内容时很有用。

image-name/version 是您要从中创建容器的实际图像。您可以使用 docker images -a 查看系统上所有图像的列表。您可能有多个版本,因此请确保选择正确的版本/标签。

-v(体积)- 最初可能不需要,但很快您就会希望在容器退出后保留数据。

好的。所以现在, docker run 刚刚从你的镜像创建了一个容器。如果它没有运行,您现在可以使用它的名称启动它:

docker start newWebServer

您可以使用以下命令检查所有容器(它们可能正在运行或未运行)

docker ps -a

您可以使用 CONTAINER ID 列中的名称或容器 ID(或仅它的前几个字符)停止和启动它们(或暂停它们),例如:

docker stop newWebServer

docker start c3028a89462c

并列出您的所有图像,

docker images -a

简而言之,下载图像; docker run 从中创建一个容器;使用 docker start(名称或容器 ID)启动它;使用 docker stop (名称或容器 ID)停止它。


docker run 不只是创建容器。它创建 + 启动容器。
S
Santosh

简单的解决方案:转到系统中的 docker 文件夹并删除大尺寸的 .raw 文件或 docker 存档。


P
Pavel M.

对我来说,问题是我在 dockerfile 中不止一次使用了图像名称。

https://i.stack.imgur.com/2oAKe.png


对多个图像使用相同的别名时可能会发生此错误