DEV Community 👩‍💻👨‍💻

Ryo Kuroyanagi
Ryo Kuroyanagi

Posted on

Script to check if docker booted for Github Actions

Background

I use Docker (docker-compose) to built system for my local development and testing on Github Actions. In my local, I can check by my eyes if my containers have booted. However, in Github Actions, I need a way to make sure that my docker containers have booted and run test for the containers after their boot. Simply I came up with the following Github Actions setting. But usually that does not work because the completion of docker-compose up -d does not mean the program / servers in the containers are ready.

jobs:
  all:
    name: My test
    runs-on: ubuntu-18.04
    steps:
      - name: Docker compose up
        run: docker-compose up -d
      - name: Test
        # run test for my containers. e.g. Access API servers
        run: ...
Enter fullscreen mode Exit fullscreen mode

Solution: Script to check health

I wrote the following bash script to check my target container health status. My docker-compose has healthcheck setting (see this article to learn how to setup). It checks the health every second and finishes its process after the container gets healthy. If the program did not get healthy within the timeout, the script exits with 1.

# Name of the target container to check
container_name="$1"
# Timeout in seconds. Default: 60
timeout=$((${2:-60}));

if [ -z $container_name ]; then
  echo "No container name specified";
  exit 1;
fi

echo "Container: $container_name";
echo "Timeout: $timeout sec";

try=0;
is_healthy="false";
while [ $is_healthy != "true" ];
do
  try=$(($try + 1));
  printf "■";
  is_healthy=$(docker inspect --format='{{json .State.Health}}' $container_name | jq '.Status == "healthy"');
  sleep 1;
  if [[ $try -eq $timeout ]]; then
    echo " Container did not boot within timeout";
    exit 1;
  fi
done
Enter fullscreen mode Exit fullscreen mode

This is the command to run the script.

healthcheck.sh <container_id|name> <timeout_in_sec>
Enter fullscreen mode Exit fullscreen mode

A realistic command should be like this. Waits 120 seconds or less until api container gets ready. Then run test.sh (Please change whatever command you want).

healthcheck.sh api 120 && test.sh
Enter fullscreen mode Exit fullscreen mode

Finally, my Github Actions got the form like this.

jobs:
  all:
    name: My test
    runs-on: ubuntu-18.04
    steps:
      - name: Docker compose up
        run: docker-compose up -d
      - name: Test
        run: healthcheck.sh api 120 && test.sh
Enter fullscreen mode Exit fullscreen mode

Appendix: Fix the name of a container

Without an explicit name, docker-compose names a container like api_1 to fix the name as you want, you must specify a name as container_name in docker-compose.yml.

services:
  api:
    container_name: api
Enter fullscreen mode Exit fullscreen mode

Top comments (0)

🤔 Did you know?

 
📚 You can adjust your experience level in Settings to see more relevant content.