我应该如何在 docker-compose healthcheck 中使用 grep?

How should i use grep in docker-compose healthcheck?

我正在尝试通过 grep curl 结果为我的 docker 应用程序添加健康检查。 当我 运行 进入 docker 容器时:

curl -sS http://nginx | grep -c works > /dev/null 
echo $?

我得到 0,一切似乎都很好,但是如果我试图将它添加到 docker-compose

version: "3.8"

services:
  php:
    build: .
    volumes:
     - ./www:/var/www
    healthcheck:
     test: ["CMD", "curl", "-sS", "http://nginx | grep", "-c", "works > /dev/null"]
     interval: 5s
     timeout: 5s
     retries: 5
  nginx:
    image: "nginx:latest"
    ports:
     - "8080:80"
    volumes:
     - ./nginx:/etc/nginx/conf.d
     - ./www:/var/www
    links:
     - php

并通过 docker-compose ps 检查它的状态为“不健康”。我做错了什么?

我猜你的问题是管道操作员。 Afaik 你也不需要 CMD。

你可以这样试试

test: curl -sS http://nginx | grep -c works > /dev/null

您还可以检查您的健康检查实际在做什么。

docker inspect myproject_php_1 --format \
  '{{range .State.Health.Log}}{{.End}} | Exit Code: {{.ExitCode}} | {{.Output}}{{end}}'

这里有两个问题:

  1. 你以一种奇怪的方式拆分你的论点 - "http://nginx | grep""works > /dev/null" 没有多大意义,将按字面意思传递给 curl

  2. 您在 test 中使用的格式不调用 shell - 因此,shell 功能如 |> 将不起作用,因为它们需要由您的 shell 解释。您需要将 test 作为字符串传递,或者使用 CMD-SHELL 形式:

   healthcheck:
     test: curl -sS http://nginx | grep -c works > /dev/null
     interval: 5s
     timeout: 5s
     retries: 5

或:

    healthcheck:
     test: ["CMD-SHELL", "curl -sS http://nginx | grep -c works > /dev/null"]
     interval: 5s
     timeout: 5s
     retries: 5

有关 healthcheck 的更多信息,您可以在 compose file reference 中阅读。

Healthcheck 可以指定为 shell 形式,也可以指定为 EXEC 数组(就像您所做的那样)。

exec 数组不支持大多数 shell 功能,例如使用管道。

如果您以 shell 形式指定它,我希望它能正常工作。即

    healthcheck:
     test: curl -sS http://nginx | grep -c works > /dev/null

或者用["CMD", "/bin/sh", "-c", "curl -sS ..."].

包裹起来