应该是你挂载 “-v /home/hhao/mysql_slave/conf:/etc/mysql ” 配置文件里面的参数问题,把 MySQL 的 log 指定到 /var/log 下了,然后 mysql 用户没有这个目录的可写权限,导致 MySQL 启动失败。
下载个镜像验证一下:
root@ab0848e14e94:/# su - mysql
No directory, logging in with HOME=/
$ cd /var/log
$ touch mysqld.log
touch: cannot touch 'mysqld.log': Permission denied
$ cd ..
$ ls -al | grep log
drwxr-xr-x 3 root root 111 Jul 17 2019 log
果然没有权限创建日志文件,问题确认就好解决了,修改宿主机上的 my.cnf 文件 log-error=/var/lib/mysql/mysqld.log ,将日志输入到有权限的 /var/lib/mysql 目录下即可,或者 修改宿主机的 /var/log 目录权限为 777 然后挂载到容器内(将宿主机目录挂载到容器内给普通用户使用时,一定要给足够权限)。
另外你在验证容器内运行用户的时候还犯了一个别的错误。
反查 MySQL 镜像的 Dockerfile:
docker history mysql:8.0.16 --no-trunc=true --format "{{.CreatedBy}}" | sed 's/^\(|3.*\)\?\/bin\/\(ba\)\?sh -c/RUN/' | sed 's/^RUN #(nop) *//' | tac | sed 's/ *&& */ \\\n \&\& /g'
可以看到容器的 ENTRYPOINT 是 /entrypoint.sh, CMD 是 mysqld ,进入容器查看 /entrypoint.sh 脚本,发现是以 gosu 的形式切换到 mysql 用户运行 mysqld 进程的,所以没有权限去 /var/log 目录下创建日志文件,而你用
docker run -it --rm --entrypoint="/bin/bash" mysql:8.0.16 -c "whoami && id"
因为覆盖了默认的 ENTRYPOINT ,所以是验证不出来实际的运行用户的,永远只能得到 root