调试docker撰写mariadb healthcheck

时间:2017-12-28 11:53:03

标签: docker docker-compose mariadb

我正在尝试在mariadb服务中添加运行状况检查,但它会阻止客户端连接到服务器,显示消息:

ERROR 2005 (HY000): Unknown MySQL server host 'mysql' (0)

可以建立连接并且所有内容都运行正常,而无需进行以下健康检查:

healthcheck:
  test: /usr/bin/learnintouch/db-health-check.sh
  interval: 30s
  timeout: 10s
  retries: 3

...健康检查的行为符合预期:

root@428b1e6c7c1a:/usr/bin/learnintouch/www/folkuniversitet# /usr/bin/learnintouch/db-health-check.sh
+ /usr/bin/mysql/install/bin/mysql --protocol=tcp -h mysql -u root -pxxxxxx -e 'show databases;'
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| db_engine          |
| db_learnintouch    |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

初始工作服务配置为:

  mysql:
    image: localhost:5000/mariadb:10.1.24
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
    networks:
      - learnintouch
    volumes:
      - "~/dev/docker/projects/learnintouch/volumes/database/data:/usr/bin/mariadb/install/data"
      - "~/dev/docker/projects/learnintouch/volumes/logs:/usr/bin/mariadb/install/logs"
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 10s

失败的服务配置是:

  mysql:
    image: localhost:5000/mariadb:10.1.24
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
    networks:
      - learnintouch
    volumes:
      - "~/dev/docker/projects/learnintouch/volumes/database/data:/usr/bin/mariadb/install/data"
      - "~/dev/docker/projects/learnintouch/volumes/logs:/usr/bin/mariadb/install/logs"
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 10s
    healthcheck:
      test: /usr/bin/learnintouch/db-health-check.sh
      interval: 30s
      timeout: 10s
      retries: 3

在服务器启动时,mariadb日志完全相同,有或没有运行状况检查,并以:

结束
2017-12-29 10:27:48 139873749194560 [Note] /usr/bin/mariadb/install/bin/mysqld: ready for connections.
Version: '10.1.24-MariaDB'  socket: '/usr/bin/mariadb/install/tmp/mariadb.sock'  port: 3306  Source distribution

以下是db-health-check.sh bash脚本:

#!/bin/bash -x

/usr/bin/mysql/install/bin/mysql --protocol=tcp -h mysql -u root -pxxxxxx -e "show databases;" || exit 1

我在使用Docker版本:

Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64
 Experimental: false

更新:

事实上有几个问题,这些问题让整个事情变得令人费解。

第一个是db-health-check.sh文件位于客户端应用程序容器中,因此当后者需要执行其运行状况检查时,服务数据库容器无法找到它。

第二个问题是db-health-check.sh文件为其mysql客户/usr/bin/mariadb/install/bin/mysql使用了错误的路径。

第三个问题是db-health-check.sh文件在其连接中使用了错误的主机名,错误地使用了mysql而不是localhost

第四个问题是root用户无法连接到1045 (28000): Access denied for user 'root'@'localhost',因为它不应该像/usr/bin/mariadb/install/bin/mysql --protocol=tcp -h localhost -u root -e "show databases;" || exit 1中那样拥有任何密码。

在纠正这些要点之后,即使健康检查到位,应用程序也可以启动并运行良好。

进一步模糊线条的一件事是,在第一次健康检查成功通过之前,该服务不可用。事实上,我将heatlcheck配置为:

healthcheck:
      test: exit 0
      interval: 60s
      timeout: 10s
      retries: 3

容器状态首先显示:

"Health": {
    "Status": "starting",
    "FailingStreak": 0,
    "Log": []
}

并且应用程序仍然无法连接到该服务,直到60秒的第一个间隔到期并且运行状况检查成功。

因此,我应该有一个较短的间隔时间,以便让应用程序不要等待太长时间才能使用。

0 个答案:

没有答案