我正在尝试熟悉 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 文件。连接到容器并创建 3 个文件后,将它们 chown
到 mysql
并重新启动容器,日志记录按预期工作。
我很确定这是一种常见的情况,而我目前的运行方式似乎非常愚蠢。 正确的做法是什么?
我可以通过在 Dockerfile 中移动所有这些东西来改进我的方法,但这对我来说仍然很奇怪。
最佳答案
我一直在寻找完全相同的东西,现在,有更好的方法来做到这一点。
docker mysql写道:
Many configuration options can be passed as flags to mysqld. This will give you the flexibility to customize the container without needing a cnf file. For example, if you want to change the default encoding and collation for all tables to use UTF-8 (utf8mb4) just run the following:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
在 docker-compose 中世界,人们可以通过 "command" 传递这些论点。服务部分:
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
在我的用例中,我只想打开日志并指定日志文件的路径:
command: mysqld --general-log=1 --general-log-file=/var/lib/mysql/general-log.log
有了足够的卷(例如 - ./logs/mysql.log:/var/lib/mysql/general-log.log
),就可以轻松访问它们。
这很简单,避免处理本地配置。它适用于任何 MySQL Docker images并将保持 my.cnf
与图像一起发送。
编辑:将路径从 /var/log/mysql/
更改为 /var/lib/mysql/
以确保 MySQL 可写文件夹。
关于mysql - 在 docker mysql 容器中启用日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39708213/