Home > Blockchain >  How should i use grep in docker-compose healthcheck?
How should i use grep in docker-compose healthcheck?

Time:02-14

I'm trying to add healthcheck for my docker app by grep the curl result. When i run into docker container:

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

I getting 0 and everything seems fine, but if I'm trying to add it into 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

and check it by docker-compose ps it has status "unhealthy". What am I doing wrong?

CodePudding user response:

There are two problems here:

  1. You split your arguments in a weird way - "http://nginx | grep" and "works > /dev/null" don't make much sense and will be passed literally to curl

  2. You are using a format in test which does not call the shell - as such, shell fetures like | and > won't work since they need to be interpreted by your shell. You need to either pass test as a string, or use the CMD-SHELL form:

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

Or:

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

For more information on healthcheck, you can read about it in the compose file reference.

CodePudding user response:

Healthcheck can be specified either in shell form, or as an EXEC array (like you have done).

The exec array doesn't support most shell functionality, like using pipes.

I expect it will work fine if you specify it in shell form. I.e.

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

Or wrap it in ["CMD", "/bin/sh", "-c", "curl -sS ..."].

CodePudding user response:

I guess your problem is the pipe operator. Afaik you also dont need the CMD.

You can try it like this.

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

You can also check what your health check is actually doing.

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