docker-compose 启动mysql 容器时 error.log 无权限访问怎么办?

场景分析

docker-compose 运行mysql 容器的时候一直报下面的错误:

.../var/log/mysql/mysql-error.log' for error logging: Permission denied"

问题分析

出现这个问题,主要是容器中启动MySQL 服务的是 mysql 用户。而我们宿主机中是没有mysql 这个用户存在的,所以产生了 Permission denied 这个错误类型。

解决问题

直接进入到mysql 容器中,查看MySQL 用户的相关信息

root@319ea9cea30b:/var/log# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
mysql:x:999:999::/home/mysql:/bin/sh
root@319ea9cea30b:/var/log# 

说明:
/etc/passwd 的文件格式:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

所以,MySQL容器启动MySQL 服务是用的mysql 用户。因此,我们可以在启动容器的时候,直接在容器中去运行一个创建error.log 的命令即可。

成功案例,MySQL

项目目录结构

[root@iZwz93izbw8wks6an5uggxZ mysql]# ls -l
total 16
drwxr-xr-x 2 root    root 4096 Aug 17 18:06 conf
drwxr-xr-x 2 polkitd root 4096 Aug 17 20:37 data
-rw-r--r-- 1 root    root  464 Aug 17 20:31 docker-compose.yml
drwxr-xr-x 2 root    root 4096 Aug 12 23:56 log
[root@iZwz93izbw8wks6an5uggxZ mysql]# tree
.
|-- conf
|   `-- my.cnf
|-- data
|-- docker-compose.yml
`-- log
    `-- error.log

3 directories, 3 files
[root@iZwz93izbw8wks6an5uggxZ mysql]# 

其中 ,data 是一个空的目录, log目录 下有一个error.log 文件, conf目录下有一个 my.cnf 文件。

my.cnf 内容

[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
symbolic-links=0
skip-host-cache
skip-name-resolve

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

docker-compose.yml 的内容

version: "3"
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
    - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
    - $PWD/conf:/etc/mysql
    - $PWD/data:/var/lib/mysql
    - $PWD/log/error.log:/var/log/mysql/error.log
    command:
    - "--default-authentication-plugin=mysql_native_password"
    entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
    restart: always

说明:
command 用来指定mysql容器启动后默认执行的命令 ,entrypoint 用来启动容器后需要执行的命令

启动容器

利用docker ps 查看正在运行的容器

[root@iZwz93izbw8wks6an5uggxZ mysql]# ls
conf  data  docker-compose.yml  log
[root@iZwz93izbw8wks6an5uggxZ mysql]# docker-compose up -d
[root@iZwz93izbw8wks6an5uggxZ mysql]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
87ada830457e        mysql:5.7           "bash -c 'chown -R m…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@iZwz93izbw8wks6an5uggxZ mysql]# 
posted @ 2020-08-17 20:55  大步向前blue  阅读(3191)  评论(0编辑  收藏  举报