来自守护进程的 Docker 错误响应:“冲突……容器已在使用”

Posted

技术标签:

【中文标题】来自守护进程的 Docker 错误响应:“冲突……容器已在使用”【英文标题】:Docker error response from daemon: "Conflict ... already in use by container" 【发布时间】:2015-10-18 23:59:58 【问题描述】:

我一直在我的 PC 上使用 Docker 运行 Quantum GIS,并按照我在此处找到的以下说明:docker-qgis-desktop - A simple docker container that runs QGIS desktop

直到上周我开始收到此错误消息时,一切都运行良好:

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

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

最新的 kartoza/qgis-desktop 没有问题

我跑了

docker pull kartoza/qgis-desktop

紧随其后

docker run -it --rm --name "qgis-desktop-2-4" -v $HOME:/home/$USER -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY kartoza/qgis-desktop:latest

我确实尝试了多次,但没有出现冲突错误 - 您必须事先退出应用程序。另外,请注意参数确实略有不同。

【讨论】:

【参考方案2】:

我经常遇到这个错误,所以现在我一次批量删除所有未使用的容器:

docker container prune 

添加-f 强制删除而不提示。

列出所有未使用的容器(不删除):

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

请参阅here 更多示例如何修剪其他对象(网络、卷等)。

【讨论】:

docker ps -a 列出我上面提到的@peter mortensen 的所有容器。【参考方案3】:

代替命令:docker run

你应该使用:

docker start **CONTAINER ID**

因为容器已经存在

More info

【讨论】:

'docker start' 没有提供启用主机网络、从命令行挂载卷以及在我的情况下必需的其他选项的选项。所以我个人不得不删除(修剪)然后运行。 @horsehair 当我使用 docker start 时,它会重新建立所有暴露的端口和卷安装。因此,根据您最初运行容器的方式,这些设置应该通过 docker start 解决。 是的,这太糟糕了,因为我希望它可以双向工作......对于加入团队的开发人员和之前运行过一次的开发人员来说,开始/运行。它不是很幂等:(。哦,好吧,我想我必须在 bash 脚本中做一些 if 逻辑【参考方案4】:

对于像我这样从谷歌登陆这里并只想使用多个 docker-compose 文件和一个共享服务构建容器的人:

有时您有不同的项目可以共享,例如一个数据库 docker 容器。只有第一次运行应该启动 DB-Docker,第二次应该检测到数据库已经在运行并跳过这个。为了实现这样的行为,我们需要将 Docker 放置在同一个 network 和同一个 project 中。 docker 容器名称也需要相同。

1st:在docker-compose中设置相同的网络和容器名称

项目 1 中的 docker-compose:

version: '3'

services:
    service1:
        depends_on:
            - postgres
        # ...
        networks:
            - dockernet

    postgres:
        container_name: project_postgres
        image: postgres:10-alpine
        restart: always
        # ...
        networks:
            - dockernet

networks:
    dockernet:

项目2中的docker-compose:

version: '3'

services:
    service2:
        depends_on:
            - postgres
        # ...
        networks:
            - dockernet

    postgres:
        container_name: project_postgres
        image: postgres:10-alpine
        restart: always
        # ...
        networks:
            - dockernet

networks:
    dockernet:

第二个:使用-pparam设置同一个项目或者把两个文件放在同一个目录下。

docker-compose -p projectname up

【讨论】:

【参考方案5】:

看起来系统中已经存在一个名为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 看起来图像试图让用户成为 root 用户,以及一个实际上已经存在的 root 组。 Docker 使用 root:root 作为默认用户和组。但是当您移除第一个容器时,第一个问题已得到解决。 嗯,很奇怪,为什么一开始就可以正常工作,即 3 - 4 个月。有什么想法可以解决这个问题吗?! 我们如何才能重新启动现有容器而不是杀死旧容器并再次使用相同的名称调用? @DhaneshMane docker restartdocker stopdocker start 应该可以帮助您。

以上是关于来自守护进程的 Docker 错误响应:“冲突……容器已在使用”的主要内容,如果未能解决你的问题,请参考以下文章

来自守护进程的 Docker 错误响应:无法启动容器

docker:来自守护进程的错误响应:grpc:连接不可用

docker:来自守护进程的错误响应:无法选择设备驱动程序“”具有功能:[[gpu]]

Docker:来自守护进程的错误响应:未能在网桥上创建端点 priceless_noether:

来自守护进程的错误响应:冲突:无法删除版本库引用 "portainerportainer:lastest"(必须强制)。

Docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:296: