遇到这个问题是因为 mysql 的配置文件中使用了一个不存在的文件来记录日志。但一般情况下,我会把mysql的配置文件 和 log 文件 map 到外面,以方便更改配置和查看日志。
究其根源,likeadmin 的 mysql配置文件如下:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_connections=1000
而 docker-compose 中相关定义如下:
mysql:
container_name: likeadmin-mysql
image: registry.cn-guangzhou.aliyuncs.com/likeadmin/mysql:5.7.44 #X86架构
#image: registry.cn-guangzhou.aliyuncs.com/likeadmin/mysql:5.7.29-amd64 #arm架构
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/mysql5.7.29/lib:/var/lib/mysql
- ./config/mysql/mysqld.cnf:/etc/mysql/my.cnf
networks:
- likeadmin
ports:
- "3306:3306"
下面是分析过程:
首先查看这个镜像:registry.cn-guangzhou.aliyuncs.com/likeadmin/mysql:5.7.44
,它看起来是私有的,里面是否有定制改动?
我们拉取公共镜像,发现镜像ID值都是 5107333e08a8
, 这说明 likeadmin 只是对此镜像做了一个转存,并没有改动任何东西。
其次,再来看产生问题的文件:/var/log/mysql/error.log
,这并不是一个正常的 mysql 日志文件,因为 mysql 默认的日志文件是存储在其安装目录下的,所以如果镜像没有改动,那就说明此文件不存在,不但文件不存在,连这个目录/var/log/mysql/
也不存在。
所以问题就很好解决了,那就是让 docker-compose 在启动之前创建它,并设置它的权限:
创建目录,创建文件,设置权限
entrypoint: bash -c "mkdir -p /var/log/mysql && touch /var/log/mysql/error.log && chown -R mysql:mysql /var/log/mysql/error.log && exec /entrypoint.sh mysqld"
更改之后是:
mysql:
container_name: likeadmin-mysql
image: registry.cn-guangzhou.aliyuncs.com/likeadmin/mysql:5.7.44 #X86架构
#image: registry.cn-guangzhou.aliyuncs.com/likeadmin/mysql:5.7.29-amd64 #arm架构
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/mysql5.7.29/lib:/var/lib/mysql
- ./config/mysql/mysqld.cnf:/etc/mysql/my.cnf
networks:
- likeadmin
entrypoint: bash -c "mkdir -p /var/log/mysql && touch /var/log/mysql/error.log && chown -R mysql:mysql /var/log/mysql/error.log && exec /entrypoint.sh mysqld"
ports:
- "3306:3306"
这就可以了。