如果端口已经绑定,为什么 Docker 运行 --rm 选项不起作用?

Why does Docker run --rm option not work if port is already bound?

$ docker rm containername
containername

然后我尝试运行一个容器并给它分配了一个名字containername

docker run -it --rm -p 8080:8080 --name containername b014d35f03a
FATA[0000] Error response from daemon: Cannot start container 2dc7aa98e8213625352e0ef8aadeaa1b6b4a0ab92c6c64c4dafe870b5bb7a49e: Bind for 0.0.0.0:8080 failed: port is already allocated 

为什么Docker现在说containername被占用了?自从我输入 --rm 以来,它不应该在退出时删除容器吗?有没有办法解决这个问题? (退出时始终移除容器)

$ docker run -it --rm -p 8080:8080 --name containername b014d35f03a
FATA[0000] Error response from daemon: Conflict. The name "containername" is already in use by container 2dc7aa98e821. You have to delete (or rename) that container to be able to reuse that name.

第一个错误,关于另一个应用程序正在使用的端口,意味着Docker 未能启动容器:

FATA[0000] Error response from daemon: Cannot start container
2dc7aa98e8213625352e0ef8aadeaa1b6b4a0ab92c6c64c4dafe870b5bb7a49e:
Bind for 0.0.0.0:8080 failed: port is already allocated 

因为它没有启动容器,所以客户端从来没有机会开始监视它以便在退出时将其删除。我怀疑此行为背后的想法是您可能希望有机会诊断此类故障,而不是简单地彻底删除容器。

您可以:

  • 打开一个问题and/or提交代码以更改行为,以便容器在任何情况下都将被删除,或者

  • 您可以使用显式 docker rm 而不是依赖客户端为您完成。例如,您始终可以在启动容器之前显式 docker rm containername。这是一种相当常见的模式,因为这意味着在发生错误时容器仍然存在,因此您可以对其进行诊断。