在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在重启时能够做到预期。