MariaDB Server Docker 官方镜像健康检查(无需 mysqladmin)
MariaDB Server 11.0 最近发布了,其 Docker 官方镜像不包含 mysqladmin
,这在一些使用场景中破坏了健康检查功能。这种行为改变让一些人感到意外。我们注意到在容器、自定义健康检查以及一些 /docker-entrypoint-initdb.d
脚本中使用了许多 mysql 相关的名称。为了帮助正确使用这些功能,让我们讨论一下容器中可用于执行健康检查和初始化功能的内容。
关于健康检查,Docker 官方镜像中没有 HEALTHCHECK
(有原因),但是 MariaDB Server 容器确实有一个healthcheck.sh 脚本。在 11.0 / 最新版本中一个常见问题是健康检查脚本中使用了缺失的 mysqladmin
可执行文件。据观察,常见的健康检查是 mysqladmin ping
,但这在容器中存在问题。最大的问题是,这种健康检查在数据库初始化(mariadb-install-db
)期间,或者在 /docker-entrypoint-initdb.d
初始化期间,或者在 MARIADB_AUTO_UPGRADE=1
期间会返回成功。执行完这三个阶段后,入口点 (entrypoint) 会突然关闭服务器,然后重新启动,这次没有 --skip-networking
参数。那些使用 --protocol=tcp
并结合 mysqladmin
/ mariadb-admin
进行健康检查的人会获得一些成功。
在 GitHub Actions 中使用 healthcheck.sh 脚本的一个简单示例如下:
services:
mariadb:
image: mariadb:latest
env:
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: true
MARIADB_MYSQL_LOCALHOST_USER: 1
MARIADB_MYSQL_LOCALHOST_GRANTS: USAGE
ports:
- 3306
healthcheck:
test: [ "CMD", "healthcheck.sh", "--su-mysql", "--connect", "--innodb_initialized" ]
start_period: 1m
start_interval: 10s
interval: 1m
timeout: 5s
retries: 3
当前存在一个 bug,需要空的 root 密码,以避免容器日志充满认证错误。这是由于 --connect
检查导致的,目前正在进行修复。
如果使用 /docker-entrypoint-initdb.d
中的脚本初始化数据库,有几种替代方案:
- 直接使用 SQL 文件,任何以 .sql 结尾的文件,或者 .sql.gz, .sql.xz, .sql.zst (用于压缩文件);
- 使用以 .sh 结尾的 bash 脚本,但不赋予执行权限,并使用入口点 (entrypoint) 的
docker_process_sql
函数来执行初始化; mariadb
自 10.4 版本起就是命令行客户端,并且在所有维护中的容器中都可用。
自负责 MariaDB Server Docker 官方镜像的日常维护以来,服务器发行说明中也详细说明了容器镜像的变化。
感谢您使用 MariaDB Server 容器。请在 GitHub 或 JIRA 上报告问题。
编辑
先前的 bug 现已修复并发布。在新安装中会创建一个 healthcheck
用户,从而可以使用更简单的 Compose 文件,例如:
services:
mariadb:
image: mariadb:latest
env:
MARIADB_ROOT_PASSWORD: sosecretonthiswebpage
ports:
- 3306
healthcheck:
test: [ "CMD", "healthcheck.sh", "--connect", "--innodb_initialized" ]
start_period: 1m
start_interval: 10s
interval: 1m
timeout: 5s
retries: 3
你帮了我大忙。
我之前漏掉了“mariadb-admin”部分。
感谢如此清晰的解释。祝你愉快!!