对我来说没有一个答案有效:
- Docker版本20.10.6
- docker-compose版本1.29.2
- docker-compose yml版本:version: '3.7'
- mysql5.7
- 在容器启动时运行脚本:docker-entrypoint-initdb.d
解决方案
检查mysql日志的最后几行是否有包含“我准备好了”之类的某些单词,这可能表明mysql已经成功启动。
这是我的compose文件:
version: '3.7'
services:
mysql:
image: mysql:5.7
command: mysqld --general-log=1 --general-log-file=/var/log/mysql/general-log.log
container_name: mysql
ports:
- "3306:3306"
volumes:
- ./install_dump:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_USER: jane
MYSQL_PASSWORD: changeme
MYSQL_DATABASE: blindspot
healthcheck:
test: "cat /var/log/mysql/general-log.log | grep \"root@localhost on using Socket\""
interval: 1s
retries: 120
some_web:
image: some_web
container_name: some_web
ports:
- "80:80"
depends_on:
mysql:
condition: service_healthy
解释
经过多次检查,我成功获取了容器的完整mysql日志。
docker logs mysql
可能已足够,但是我无法在healthcheck中访问docker日志,因此我不得不使用以下命令将mysql的查询日志转储到文件中:
command: mysqld --general-log=1 --general-log-file=/var/log/mysql/general-log.log
之后我多次运行了mysql容器,以确定日志是否相同。我发现最后几行始终相同:
2021-08-30T01:07:06.040848Z 10 Connect root@localhost on using Socket
2021-08-30T01:07:06.041239Z 10 Query SELECT @@datadir, @@pid_file
2021-08-30T01:07:06.041671Z 10 Query shutdown
2021-08-30T01:07:06.041705Z 10 Query
mysqld, Version: 5.7.31-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
最终,在尝试了一些方法后,这个grep只返回了一个匹配项,对应于在/docker-entrypoint-initdb.d
中执行转储后mysql日志的结尾:
cat /var/log/mysql/general-log.log | grep \"root@localhost on using Socket\"
Words like
started with or
Tcp port: returned several matches (start, middle and at the end of log) so are not options to detect the end of starting mysql success log.
健康检查
幸运的是,当grep找到至少一个匹配项时,它会返回成功的存在代码(0)。因此,在健康检查中使用它很容易:
healthcheck:
test: "cat /var/log/mysql/general-log.log | grep \"root@localhost on using Socket\""
interval: 1s
retries: 120
改进
- 如果有人知道如何在healthcheck内获取docker logs MySQL,则比启用查询日志更好
- 处理当SQL脚本返回错误时
mysql -u USER -p PASSWORD -h MYSQLSERVERNAME -e 'select * from foo...' database-name
。 - Jorge Campos