如何获得一个docker集装箱的状态:死亡debugging?

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

你已经要求一个dead容器。

TL; DR:这是如何创build一个死容器

不要在家里这样做:

 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 

说明

我检查了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() 

所以,如果docker无法删除容器根目录,它仍然是死的,不会继续到Removed状态。 所以我强制文件权限不允许根删除文件( chattr -i )。

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

对于docker -1.12 +, HEALTHCHECK instruction可以帮助您。

HEALTHCHECK指令告诉Docker如何testing一个容器来检查它是否还在工作。 这可以检测到一些情况,例如一个陷入无限循环的web服务器,即使服务器进程仍在运行,也无法处理新的连接。

例如,我们有一个Dockerfile来定义我自己的webapp:

 FROM nginx:1.13.1 RUN apt-get update \ && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/* HEALTHCHECK --interval=15s --timeout=3s \ CMD curl -fs http://localhost:80/ || exit 1 

每五分钟检查一次,networking服务器能够在三秒内为网站的主页面提供服务。 该命令的退出状态表示容器的健康状态。 可能的值是:

0:成功 – 容器是健康的,可以使用
1:不健康 – 容器工作不正常
2:保留 – 不要使用这个退出码

然后使用docker build命令来构build一个图像:

 $ docker build -t myapp:v1 . 

并使用此图像运行一个容器:

 $ docker run -d --name healthcheck-demo -p 80:80 myapp:v1 

检查容器的状态:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b812c8d6f43a myapp:v1 "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds (health: starting) 0.0.0.0:80->80/tcp healthcheck-demo 

一开始,集装箱的状况是(health: starting) ; 过了一段时间,它变得healthy

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2bb640a6036 myapp:v1 "nginx -g 'daemon ..." 2 minutes ago Up 5 minutes (healthy) 0.0.0.0:80->80/tcp healthcheck-demo 

它会retries consecutive failures的健康检查retries consecutive failures的容器被认为是unhealthy

您可以使用自己的脚本来replace命令curl -fs http://localhost:80/ || exit 1 curl -fs http://localhost:80/ || exit 1 。 更重要的是,你的脚本的stdoutstderr可以从docker inspect命令中获取:

 $ docker inspect --format '{{json .State.Health}}' healthcheck-demo |python -m json.tool { "FailingStreak": 0, "Log": [ { "End": "2017-06-09T19:39:58.379906565+08:00", "ExitCode": 0, "Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 612 100 612 0 0 97297 0 --:--:-- --:--:-- --:--:-- 99k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n font-family: Tahoma, Verdana, Arial, sans-serif;\n }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n", "Start": "2017-06-09T19:39:58.229550952+08:00" } ], "Status": "healthy" } 

希望这可以帮助!