我需要让一些容器处于死状态,因为我想检查我的脚本是否正常工作。欢迎任何建议。谢谢你。
最佳答案
您要求提供 dead
容器。
TL;DR:这是如何创建一个死容器
不要在家里这样做:
ID=$(docker run --name dead-experiment -d -t alpine sh)
docker kill dead-experiment
test "$ID" != "" && chattr +i -R /var/lib/docker/containers/$ID
docker rm -f dead-experiment
瞧,docker 无法删除容器根目录,所以它落到了
status=dead
:docker ps -a -f status=dead
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
616c2e79b75a alpine "sh" 6 minutes ago Dead dead-experiment
解释
我检查了 source code of docker and saw this state transition :
container.SetDead()
// (...)
if err := system.EnsureRemoveAll(container.Root); err != nil {
return errors.Wrapf(err, "unable to remove filesystem for %s", container.ID)
}
// (...)
container.SetRemoved()
因此,如果 docker 无法删除容器根目录,它会保持为死状态,不会继续进入 Removed 状态。所以我强制文件权限不允许 root 删除文件(
chattr -i
)。PS:要恢复目录权限,请执行以下操作:
chattr -i -R /var/lib/docker/containers/$ID
关于docker - 如何让 docker 容器进入状态 : dead for debugging?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44455501/