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 容器。请在 GitHubJIRA 上报告问题。

编辑

先前的 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