在docker mysql容器中启用日志logging

我试图熟悉docker生态系统,并试图设置一个MySQL数据库容器。 用docker-compose这看起来像:

 version: '2' services: db: image: mysql:5.6.33@sha256:31ad2efd094a1336ef1f8efaf40b88a5019778e7d9b8a8579a4f95a6be88eaba volumes: - "./db/data:/var/lib/mysql" - "./db/log:/var/log/mysql" - "./db/conf:/etc/mysql/conf.d" restart: "yes" environment: MYSQL_ROOT_PASSWORD: rootpw MYSQL_DATABASE: db MYSQL_USER: db MYSQL_PASSWORD: dbpw 

我的conf目录包含一个文件:

 [mysqld] log_error =/var/log/mysql/mysql_error.log general_log_file=/var/log/mysql/mysql.log general_log =1 slow_query_log =1 slow_query_log_file=/var/log/mysql/mysql_slow.log long_query_time =2 log_queries_not_using_indexes = 1 

不幸的是,我没有这样的日志文件。 该设置本身是正确的,并使用cnf文件。 连接到容器并创build3个文件后,将它们切换到mysql并重新启动容器,logging工作正常。

我很确定这是一个常见的情况,我目前的方式让它运行似乎真的很愚蠢。 什么是正确的方法来做到这一点?

我可以通过在Dockerfile中移动所有这些东西来改进我的方法,但这对我来说仍然很奇怪。

连接到容器并创build3个文件后,将它们切换到mysql并重新启动容器,logging工作正常。

这指向主机卷权限问题。 当你从一个容器映射到主机时,没有用户标识的映射,并且容器内的uid附加的名字可能与外部有很大的不同。 您需要使用容器用户可以写入的内容来初始化目录权限。 一个简单的方法是创build一个有权写入主机和容器上的文件的组,然后在图像和主机操作系统上将各种用户添加到该组。 另一个select是使用不直接从主机访问的命名文件系统,并使用映像的目录权限对其进行初始化。


编辑:与你的docker-compose.yml一个命名卷的例子是如此简单:

 version: '2' volumes: mysql-data: driver: local mysql-log: driver: local mysql-conf: driver: local services: db: image: mysql:5.6.33 volumes: - "mysql-data:/var/lib/mysql" - "mysql-log:/var/log/mysql" - "mysql-conf:/etc/mysql/conf.d" restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: rootpw MYSQL_DATABASE: db MYSQL_USER: db MYSQL_PASSWORD: dbpw 

请注意,我也从你的图像名称中删除了sha256,这个引用将阻止你能够拉图像的补丁版本。 我也更喜欢“除非停止”的重启策略,以便Docker在重启时能够做到预期。