我应该如何在 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}}'
这里有两个问题:
你以一种奇怪的方式拆分你的论点 - "http://nginx | grep"
和 "works > /dev/null"
没有多大意义,将按字面意思传递给 curl
您在 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 ..."]
.
包裹起来
我正在尝试通过 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}}'
这里有两个问题:
你以一种奇怪的方式拆分你的论点 -
"http://nginx | grep"
和"works > /dev/null"
没有多大意义,将按字面意思传递给curl
您在
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 ..."]
.