Github 작업을 위해 도커가 부팅되었는지 확인하는 스크립트

배경



Github Actions에서 로컬 개발 및 테스트를 위한 시스템을 구축하기 위해 Docker(docker-compose)를 사용합니다. 내 지역에서는 컨테이너가 부팅되었는지 눈으로 확인할 수 있습니다. 그러나 Github Actions에서 도커 컨테이너가 부팅되었는지 확인하고 부팅 후 컨테이너에 대한 테스트를 실행하는 방법이 필요합니다. 간단하게 다음 Github Actions 설정을 생각해 냈습니다. 그러나 일반적으로 docker-compose up -d의 완료가 컨테이너의 프로그램/서버가 준비되었음을 의미하지 않기 때문에 작동하지 않습니다.

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: ...


솔루션: 상태를 확인하는 스크립트



대상 컨테이너 상태를 확인하기 위해 다음 bash 스크립트를 작성했습니다. 내 docker-compose에 healthcheck 설정이 있습니다(설정 방법을 알아보려면 참조). 매 초마다 상태를 확인하고 컨테이너가 정상이 되면 프로세스를 완료합니다. 프로그램이 제한 시간 내에 정상 상태가 되지 않으면 스크립트가 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


이것은 스크립트를 실행하는 명령입니다.

healthcheck.sh <container_id|name> <timeout_in_sec>


현실적인 명령은 이래야 합니다. 120 컨테이너가 준비될 때까지 api초 이하로 기다립니다. 그런 다음 test.sh를 실행합니다(원하는 명령을 변경하십시오).

healthcheck.sh api 120 && test.sh


마지막으로 내 Github Actions에는 다음과 같은 형식이 있습니다.

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


부록: 컨테이너 이름 수정



명시적인 이름이 없으면 docker-compose는 api_1와 같은 컨테이너 이름을 지정하여 원하는 이름을 수정합니다. container_name에서 docker-compose.yml로 이름을 지정해야 합니다.

services:
  api:
    container_name: api

좋은 웹페이지 즐겨찾기