Search code examples
loggingdockerdocker-composehealth-monitoring

How to view docker-compose healthcheck logs?


Inside my docker-compose.yml, I have the following service healthcheck section. I want to know if MariaDB is actually ready to handle queries. A service named cmd is configured to depend on condition: service_healthy.

  db:
    image: mariadb:10
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: database
    healthcheck:
      test: ["CMD", "mysql", "--user=user", "--password=password", "--execute='SELECT 1'", "--host=127.0.0.1", "--port=3306"]
      interval: 1s
      retries: 30

This healthcheck does not work, shows that the service is unhealthy.

How do I check the output of the test CMD?


Solution

  • You can use:

    docker inspect --format "{{json .State.Health }}" <container name> | jq
    

    Output:

    {
        "Status": "unhealthy",
        "FailingStreak": 63,
        "Log": [
            {
                "Start": "2017-03-11T20:49:19.668895201+03:30",
                "End": "2017-03-11T20:49:19.735722044+03:30",
                "ExitCode": 1,
                "Output": "ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''SELECT 1'' at line 1\n"
            }
        ]
    }
    

    And look for the output section.

    To get the Output only:

    docker inspect --format "{{json .State.Health }}" mariadb_db_1 | jq '.Log[].Output'
    

    For swarm mode use the folling format (thanks for pointing it out @shotgunner):

    {{json.Spec.TaskTemplate.ContainerSpec.Healthcheck}}

    Feel free to swap jq for whatever tool you use for json pretty print.