如何让 docker 容器进入状态:dead 进行调试?

qub*_*sup 6 containers docker dockerfile

我需要让一些容器进入死状态,因为我想检查我的脚本是否正在工作。欢迎任何建议。谢谢。

Rob*_*ert 5

您要求提供一个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
Run Code Online (Sandbox Code Playgroud)

瞧,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
Run Code Online (Sandbox Code Playgroud)

解释

我检查了docker 的源代码并看到了这种状态转换:

container.SetDead()
// (...)
if err := system.EnsureRemoveAll(container.Root); err != nil {
    return errors.Wrapf(err, "unable to remove filesystem for %s", container.ID)
}
// (...)
container.SetRemoved()
Run Code Online (Sandbox Code Playgroud)

因此,如果 docker 无法删除容器根目录,它将保持死亡状态,并且不会继续处于已删除状态。所以我强制文件权限不允许 root 删除文件 ( chattr -i)。

PS:要恢复目录权限,请执行以下操作:chattr -i -R /var/lib/docker/containers/$ID