Thêm một giải pháp cập nhật cho phương pháp kiểm tra sức khỏe. Đoạn mã đơn giản:
healthcheck:
test: out=$$(mysqladmin ping -h localhost -P 3306 -u foo
Giải thích : Vì mysqladmin ping
trả về kết quả dương tính sai (đặc biệt là sai mật khẩu), tôi đang lưu đầu ra vào một biến tạm thời, sau đó sử dụng grep
để tìm kết quả mong đợi ( mysqld is alive
). Nếu tìm thấy nó sẽ trả về mã lỗi 0. Trong trường hợp không tìm thấy nó, tôi sẽ in toàn bộ thông báo và trả lại 1 mã lỗi.
Đoạn mã mở rộng:
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
Giải thích : Tôi đang sử dụng các bí mật của docker thay vì các biến env (nhưng điều này cũng có thể đạt được với các env vars thông thường). Việc sử dụng $$
là cho $
ký hiệu chữ được loại bỏ khi chuyển đến vùng chứa.
Đầu ra từ docker inspect --format "{{json .State.Health }}" db | jq
các trường hợp khác nhau:
Mọi thứ vẫn ổn:
{
"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 chưa lên (chưa):
{
"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"
}
]
}
Sai mật khẩu:
{
"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"
}
]
}