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]# 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM