无法停止或重新启动码头容器

当尝试停止或重新启动一个 docker 容器时,我会得到以下错误消息:

$ docker restart 5ba0a86f36ea
Error response from daemon: Cannot restart container 5ba0a86f36ea: [2] Container does not exist: container destroyed
Error: failed to restart containers: [5ba0a86f36ea]

但当我逃跑的时候

$ docker logs -f 5ba0a86f36ea

我能看到日志,所以集装箱显然是存在的,有什么想法吗?

编辑:

对不起,我忘了告诉你:

当我运行 docker ps -a时,我看到容器正在运行。但是它里面的应用程序出了故障,所以我想重新启动它,或者只是在线获得该应用程序的一个新版本。但是当我不能停止并删除容器时,我也不能启动并运行一个新的应用程序,这将监听相同的端口。

284903 次浏览

这看起来像 码头/码头/问题/12738码头1.6或1.7:

有些容器无法正确停止,并重新启动

当我们的用户主机从1.5.0升级到1.6.0时,我们经常看到这个问题。
升级后,一些容器不能停止(给出 500 Server Error: Internal Server Error ("Cannot stop container xxxxx: [2] Container does not exist: container destroyed")或强制销毁(给出 500 Server Error: Internal Server Error ("Could not kill running container, cannot remove - [2] Container does not exist: container destroyed")。 进程仍然在主机上运行。
有时,它在重新启动 docker 守护进程后工作。

有一些变通办法:

我已经尝试了这个不可杀死容器的所有远程 API 调用,结果如下:

  • jsonstatschangestoplogs返回有效的响应
  • stoppausewaitkill报告404(!)

在我完成远程 API 之后,我再次检查了 docker ps(容器仍然在那里) ,但是我重试了 docker kill,它工作了!集装箱被杀了,我可以把它取出来。

或者:

有效的方法是在我的主机上重新启动 boot2docker,然后是 docker rm -f

$ boot2docker stop
$ boot2docker start
$ docker rm -f 1f061139ba04

值得一知:

如果您正在运行一个 ENTRYPOINT 脚本... 该脚本将与 Shebang 一起工作

#!/bin/bash -x

但会阻止集装箱停止与

#!/bin/bash -xe

我无法在我的机器中定位 boot2docker,所以,我想出了一个适合我的方法。

$ sudo systemctl restart docker.socket docker.service
$ docker rm -f <container id>

看看是否对你也有帮助。

所有码头工人: start | restart | stop | rm --force | kill命令 如果容器卡住,可能无法工作。您总是可以重新启动 docker 守护进程。但是,如果运行的是其他容器,则可能不会选择这种方式。你能做的是:

ps aux | grep <<container id>> | awk '{print $1 $2}'

输出包括:

<<user>><<process id>>

然后像下面这样终止与容器关联的进程:

sudo kill -9 <<process id from above command>>

这将终止容器,您可以使用正确的映像启动一个新的容器。

好好享受吧

sudo aa-remove-unknown

我就是这么做的。

我在一台 Windows 主机上遇到了同样的问题,这里的其他选项都不适合我。最后我只需要删除物理容器文件夹,它位于这里:

C:\ProgramData\Docker\containers\[container guid]

为了安全起见,我首先停止了码头服务,当我重新启动它时,破损的集装箱已经不见了,我能够创建新的集装箱。我怀疑同样的方法也适用于 linux 主机,但是我不知道在那个操作系统上容器文件夹保存在哪里。

使用“ top”命令检查是否有僵尸进程。

docker ps | grep <<container name>>

拿到集装箱标识。

ps -ef | grep <<container id>>


ps -ef|grep defunct | grep java

并通过父 PID 杀死容器。

如果你在使用 Ubuntu,请确保 docker-compose 没有安装得很快。这将导致各种各样的随机问题,包括上述问题。

去掉按钮:

sudo snap remove docker-compose

并从组合存储库手动安装:

码头工人撰写安装说明书

在我的例子中,我不能删除用 nomad 作业创建的容器, docker logs <ContainerID>没有输出,一般来说,它看起来像是冻结了。

到目前为止的解决方案是: sudo service docker restart,可以有人建议一个更好的吗?

对于安装了 Docker 桌面的 Mac 用户来说。我能够只是点击托盘图标,并说 Restart Docker。一旦重新启动,就可以删除容器。

如果你在 Mac 电脑上,通过终端尝试: 使用 killall Docker退出 Docker。

在“应用程序”文件夹中或使用 open /Applications/Docker.app重新启动它。

随后,您可以为相关容器运行 docker rm <id>

在我的情况下,docker rm $(docker ps -aq)为我工作。

有时这是由于 docker 守护进程的问题造成的。 我通过重新启动码头服务解决了这个问题。 在 Linux 上:

systemctl restart docker

我忘了我已经让集装箱开始作为一个系统服务。
所以如果我停止或杀死集装箱,服务会把它带回来。

如果使用 systemctl,则可以使用 systemctl | grep running列出所有正在运行的服务并查找服务的名称。

那就用 sudo systemctl disable <your_service_name>阻止它。

Ubuntu 使用容器的系统进程 ID 停止容器。 使用以下方法获取主进程 ID:

Docker 查看-f’{ . State. Pid }’容器-id

这将返回一个 ID 作为 25430。 用命令杀了它

Sudo kill-925430