在主机目录中挂载mysql容器的日志

6
我希望能够在mysql容器内挂载主机的目录,这样mysql就可以将其日志写入该目录,我也可以从主机上访问这些日志。
为此,我使用以下卷配置:
volumes:
  - ./logs/mysql:/var/log/mysql

但是正如这个答案所指出的那样,主机用户和容器用户之间存在权限问题。那里的解决方案是使用命名卷,但我想要的是在方便的目录中访问主机上的这些日志。不要放在docker的内部目录中。


1
您仍然可以通过具有sudo权限的任何人访问它们。 - Nigel Ren
@NigelRen 的问题在于,除非明确授权,否则 MySQL 不会将日志写入目录。 - Ayushya
你使用的是哪个MySQL镜像? - Tarun Lalwani
@TarunLalwani 我正在使用 mysql:latest 镜像 ID 为 c73c7527c03a。 - Ayushya
2个回答

11

我运行了默认的镜像并做了一些观察:

  1. 默认情况下,日志文件根本不会在 /var/log/mysql 中创建。这是因为默认的 my.cnf 文件中的 error-log 设置被注释掉了。
  2. 您需要创建自己的配置文件以添加这些设置,并将它们映射到 /etc/mysql/mysql.conf.d 目录中。
  3. /entrypoint.sh 确实更改了 /var/lib/mysql 的权限,但没有更改 /var/log/mysql 的权限。

因此,要解决此问题,请添加一个名为 test.cnf 的文件,其内容如下:

[mysqld]
log-error   = /var/log/mysql/error.log
general_log  = /var/log/mysql/log_output.log

并更新您的docker-compose文件,使用以下设置

version: '2'

services:
  mysql:
    image: mysql:latest
    volumes:
      - ./logs:/var/log/mysql
      - ./test.cnf:/etc/mysql/mysql.conf.d/test.cnf
    environment:
      MYSQL_ROOT_PASSWORD: root
    entrypoint: ""
    command: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"

这将确保在运行入口脚本之前设置了适当的权限。


1
我认为这可能是正确的,但我无法使其工作。如果我使用空白的入口点,docker-compose.yml文件无效,如果我完全删除“entrypoint”,容器将以错误代码0退出。在第二种情况下,我认为由于使用了“command”,默认的入口点被覆盖了。我正在尝试让它工作,当它工作时,我认为这应该是被接受的答案 :) - Ayushya
不起作用,没有错误,容器仍然退出并显示错误代码0。 - Ayushya
如果有帮助的话,我只使用了 docoker-compose.yml 中的一个服务 mysql-database,并在该服务上测试了您提供的代码。 - Ayushya
太好了!它现在可以工作了。数据库正在运行,但是仍然没有日志!当我挂载主机目录时,就不会生成日志,如果主机目录没有被挂载,那么我就能看到日志。 - Ayushya
@Ayushya,这不是Ubuntu特定的问题。我只在Ubuntu虚拟机上测试过,并发布了解决方案。但你的问题可能与你使用的Windows/VM组合有关。 - Tarun Lalwani
显示剩余7条评论

0
你离得很近。
主文件夹./logs/mysql需要由UID 999拥有 - 如果你没有root访问权限或者./logs/mysql在映射驱动器上,比如NTFS或CIFS,这可能会给你带来问题。
启用错误日志的设置在文档中这里有详细说明 - 最新版本的Maria会从多个位置读取配置文件,并且该变量的最后一个设置将生效 - 所以我在/etc/mysql/mariadb.conf.d/50-server.cnf中进行了设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接