场景分析
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]#