我正在尝试在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秒的第一个间隔到期并且运行状况检查成功。
因此,我应该有一个较短的间隔时间,以便让应用程序不要等待太长时间才能使用。