尝试对 docker 检查 State.Health 给出`map has no entry for key "State"`

dja*_*son 5 docker docker-compose

我正在尝试在容器中使用 Docker HEALTHCHECK。我在版本 3 docker-compose 文件中进行设置,该文件也支持healthcheck

version: '3'

services:
  api:
  [...]
    healthcheck:
      test: test ! -e /unhealthy
      interval: 10s
      timeout: 1s
      retries: 1
Run Code Online (Sandbox Code Playgroud)

在我能找到的每个地方,包括在 stackoverflow 上,检查容器健康状况的方法是使用docker inspect并查看State.Health,但不存在这样的条目:

$ docker inspect --format='{{json .State}}' api
Template parsing error: template: :1:7: executing "" at <.State>: map has no entry for key "State"
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了很长一段时间,但看不到这些信息移动到哪里或任何其他检查健康状态的方法。

版本信息:

$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac219
$ docker --version
Docker version 17.09.0-ce, build afdb6d4
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 6

服务名称api是一个组合结构。Docker 无法将名称映射api到容器。我怀疑你有一个名为另一个对象apidocker inspect被仰视。

组合容器通常命名为{{parent_directory}}_{{service}}_{{n}}. 要查找名称,请使用:

docker-compose ps
docker ps -a --filter name=SERVICE_NAME
Run Code Online (Sandbox Code Playgroud)

然后您可以在该名称上使用检查

docker inspect --format='{{json .State}}' CONTAINER_ID_OR_NAME
Run Code Online (Sandbox Code Playgroud)

或专门检查容器以避免非容器对象:

docker container inspect --format='{{json .State}}' CONTAINER_ID_OR_NAME
Run Code Online (Sandbox Code Playgroud)

所有容器都应该有.State对象。只有定义了健康检查的容器才会有.State.Health数据。