ใน dockerfile เราสามารถเขียน healthcheck ได้เพื่อให้มันตรวจสอบสถานะแอปพลิเคชั่นว่ามันยังใช้งานได้อยู่ไหม เมื่อเราทำการพิมพ์ docker ps มันจะแสดงประมาณนี้

docker health check

จะสังเกตุว่ามีคำว่า healthy อยู่แสดงว่าแอปพลิเคชั่นยังใช้งานได้ปกติ

ซึ่งผมจะเอาไปใช้งานร่วมกับตอนเขียน gitlab-ci ในช่วงของ deploy job ซึ่งหลังจากเรา deploy ไปแล้ว เราต้องการทราบว่า container ตัวที่เราพึ่ง deploy ไปมันพร้อมใช้งานแล้วหรือยัง?

ปัญหาคือ ผมจะรู้ค่า healthy ของ container ได้ยังไงผ่าน gitlab-ci เพื่อไปเขียนว่าถ้ามัน healthy ให้ pipeline success ถ้าไม่ก็ pipeline fail ออกมาเลย

คำสั่งดูว่า Container มี status อะไร

ฉะนั้นสิ่งแรกเราต้องการทราบก่อนว่า Container มัน healthy ยังให้ใช้คำสั่ง

docker inspect --format "{{json .State.Health }}" "$CONTAINER_NAME" | jq '.Status'

เราจะได้ค่า healthcheck ออกมา เช่น "healthy"

container-healthcheck

ใช้ร่วมกับ Gitlab-ci

เมื่อเราได้คำสั่งข้างต้นมาแล้ว ให้มาเขียน check-docker-health.sh ไว้ตรวจสอบก่อน

#!/bin/bash

CONTAINER_NAME="stu-line-message-api-api-1"
HEALTH_STATUS=$(docker inspect --format "{{json .State.Health }}" "$CONTAINER_NAME" | jq -r '.Status')

docker inspect --format "{{json .State.Health }}" "$CONTAINER_NAME" | jq '.Status'

if [[ "$HEALTH_STATUS" == "healthy" ]]; then
  echo "Pipeline passed: Docker container is healthy"
  exit 0  # สิ้นสุด script ด้วยสถานะสำเร็จ (สีเขียว)
else
  echo "Pipeline failed: Docker container is not healthy"
  exit 1  # สิ้นสุด script ด้วยสถานะล้มเหลว (สีแดง)
fi

จากคำสั่งข้างต้นคือให้มันตรวจสอบ container ที่เราระบุไว้ว่ามี status เป็น healthy หรือยัง ถ้าใช่ก็ให้มัน exit 0 ออกมา ถ้าเป็นคำอื่นนอกเหนือจาก healthy ก็ให้มัน exit 1 ออกมา

จากนั้นมาเขียน Gitlab-ci ไว้ใช้งานกัน

dev-deploy:
  script:
    - $PROD_SSH "app deploy command"
    - $PROD_SSH "./check-docker-health.sh"

นำไปประยุกต์ใช้งานกันตามสะดวก...