상태 확인 접근 방식을위한 업데이트 된 솔루션 추가. 간단한 스 니펫 :
healthcheck:
test: out=$$(mysqladmin ping -h localhost -P 3306 -u foo
설명 : mysqladmin ping
잘못된 긍정 (특히 잘못된 암호)을 반환 하기 때문에 출력을 임시 변수에 저장 한 다음을 사용 grep
하여 예상 출력을 찾습니다 (mysqld is alive
). 발견되면 0 오류 코드를 반환합니다. 찾을 수없는 경우 전체 메시지를 인쇄하고 1 개의 오류 코드를 반환합니다.
확장 된 스 니펫 :
version: "3.8"
services:
db:
image: linuxserver/mariadb
environment:
- FILE__MYSQL_ROOT_PASSWORD=/run/secrets/mysql_root_password
- FILE__MYSQL_PASSWORD=/run/secrets/mysql_password
secrets:
- mysql_root_password
- mysql_password
healthcheck:
test: out=$$(mysqladmin ping -h localhost -P 3306 -u root
secrets:
mysql_root_password:
file: ${SECRETSDIR}/mysql_root_password
mysql_password:
file: ${SECRETSDIR}/mysql_password
설명 : env 변수 대신 docker secrets 를 사용 하고 있습니다 (하지만 일반 env vars에서도 가능합니다). 의 사용은 컨테이너로 전달 될 때 제거되는 $$
리터럴 $
기호에 사용 됩니다.
docker inspect --format "{{json .State.Health }}" db | jq
다양한 경우의 출력 :
괜찮습니다.
{
"Status": "healthy",
"FailingStreak": 0,
"Log": [
{
{
"Start": "2020-07-20T01:03:02.326287492+03:00",
"End": "2020-07-20T01:03:02.915911035+03:00",
"ExitCode": 0,
"Output": "mysqld is alive\n"
}
]
}
DB가 작동하지 않음 (아직) :
{
"Status": "starting",
"FailingStreak": 1,
"Log": [
{
"Start": "2020-07-20T01:02:58.816483336+03:00",
"End": "2020-07-20T01:02:59.401765146+03:00",
"ExitCode": 1,
"Output": "\u0007mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 \"No such file or directory\")' Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!\n"
}
]
}
잘못된 비밀번호:
{
"Status": "unhealthy",
"FailingStreak": 13,
"Log": [
{
"Start": "2020-07-20T00:56:34.303714097+03:00",
"End": "2020-07-20T00:56:34.845972979+03:00",
"ExitCode": 1,
"Output": "\u0007mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
}
]
}