docker - 如何让 docker 容器进入状态 : dead for debugging?

标签 docker containers dockerfile

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

最佳答案

您要求提供 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/

相关文章:

mongodb - docker 撰写 : can not connect node container to Mongo container using the same network

docker - 从外部连接到在Docker容器内运行的服务

docker - 如何构建自定义 nginx :alpine based container listening on port other than 80?

docker - Docker 镜像的测试工具

bash - 在kubernetes中创建一个可以运行GNU屏幕的Pod

PHP 应用程序无法使用 Docker Compose 连接到 MariaDB

docker - Ping不会安装在Docker容器中

docker - 如何将字体添加到Windows Docker容器/图像?

azure - Azure 容器可以使用 vTPM、安全启动和证明机制吗?还是需要 VM?

docker - 如何使用 docker 容器作为 apache 服务器?